SQL查询优化笔记
查询1分析
sql
SELECT DISTINCT
n.F4000,
n.F4003,
n.EMO_GRD,
n.SIM_TTL
FROM
newsai AS n
INNER JOIN newsobjectai AS o ON n.F4000 = o.F4000
AND o.IS_VLD = 1
AND o.ENT_CD != ''
AND o.COR_DG >= 5
WHERE
n.IS_VLD = 1 AND n.THE_CD IS NOT NULL
ORDER BY
n.F4003 DESC
LIMIT 10优化建议
DISTINCT使用:DISTINCT操作会消除重复行,但这是一个开销较大的操作。如果确保连接条件已经能保证结果唯一,可以移除DISTINCT。
索引优化:
- 确保
n.F4000和o.F4000上有索引 - 为
n.IS_VLD和n.THE_CD创建复合索引 - 为
o.IS_VLD,o.ENT_CD,o.COR_DG创建复合索引 - 为排序字段
n.F4003创建索引
- 确保
查询重写:考虑使用EXISTS代替JOIN,特别是当只需要检查关联表中是否存在匹配记录时。
查询2分析
sql
SELECT
n.F4000,
n.F4003,
n.EMO_GRD,
n.SIM_TTL
FROM newsai AS n
WHERE n.IS_VLD = 1
AND n.THE_CD IS NOT NULL
AND EXISTS (
SELECT 1
FROM newsobjectai AS o
WHERE o.F4000 = n.F4000
AND o.IS_VLD = 1
AND o.ENT_CD != ''
AND o.COR_DG >= 5
)
ORDER BY n.F4003 DESC
LIMIT 10;优化建议
EXISTS优化:这个查询已经使用了EXISTS,通常比JOIN更高效,特别是对于"存在性检查"的场景。
索引优化:
- 确保
n.F4000和o.F4000上有索引 - 为
n.IS_VLD和n.THE_CD创建复合索引 - 为
o.F4000,o.IS_VLD,o.ENT_CD,o.COR_DG创建复合索引 - 为排序字段
n.F4003创建索引
- 确保
LIMIT下推:某些数据库支持将LIMIT下推到子查询中,减少需要处理的数据量。
通用优化建议
索引策略:
- 为所有连接条件和WHERE条件中的列创建适当的索引
- 考虑为ORDER BY列创建索引以避免排序操作
统计信息:确保数据库统计信息是最新的,以便优化器能选择最佳执行计划
查询计划分析:使用EXPLAIN分析两个查询的执行计划,比较它们的性能差异
数据分布:了解
F4000字段的选择性,如果选择性高,索引效果会更好硬件考虑:确保数据库服务器有足够的内存来处理排序操作
结论
第二个查询(使用EXISTS)在理论上可能更高效,因为它一旦找到匹配就会停止处理,而不需要像JOIN那样产生中间结果集。但实际性能需要通过EXPLAIN和实际执行时间来验证。
建议在测试环境中对两个查询进行性能测试,使用真实数据量来评估哪个更适合您的场景。