Skip to content

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

优化建议

  1. DISTINCT使用:DISTINCT操作会消除重复行,但这是一个开销较大的操作。如果确保连接条件已经能保证结果唯一,可以移除DISTINCT。

  2. 索引优化

    • 确保n.F4000o.F4000上有索引
    • n.IS_VLDn.THE_CD创建复合索引
    • o.IS_VLD, o.ENT_CD, o.COR_DG创建复合索引
    • 为排序字段n.F4003创建索引
  3. 查询重写:考虑使用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;

优化建议

  1. EXISTS优化:这个查询已经使用了EXISTS,通常比JOIN更高效,特别是对于"存在性检查"的场景。

  2. 索引优化

    • 确保n.F4000o.F4000上有索引
    • n.IS_VLDn.THE_CD创建复合索引
    • o.F4000, o.IS_VLD, o.ENT_CD, o.COR_DG创建复合索引
    • 为排序字段n.F4003创建索引
  3. LIMIT下推:某些数据库支持将LIMIT下推到子查询中,减少需要处理的数据量。

通用优化建议

  1. 索引策略

    • 为所有连接条件和WHERE条件中的列创建适当的索引
    • 考虑为ORDER BY列创建索引以避免排序操作
  2. 统计信息:确保数据库统计信息是最新的,以便优化器能选择最佳执行计划

  3. 查询计划分析:使用EXPLAIN分析两个查询的执行计划,比较它们的性能差异

  4. 数据分布:了解F4000字段的选择性,如果选择性高,索引效果会更好

  5. 硬件考虑:确保数据库服务器有足够的内存来处理排序操作

结论

第二个查询(使用EXISTS)在理论上可能更高效,因为它一旦找到匹配就会停止处理,而不需要像JOIN那样产生中间结果集。但实际性能需要通过EXPLAIN和实际执行时间来验证。

建议在测试环境中对两个查询进行性能测试,使用真实数据量来评估哪个更适合您的场景。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer