文章内容收录到个人网站,方便阅读:hardyfish.top/

这种情况的核心问题可能出在索引使用方式或查询优化上。

如何正确分析 SQL 执行计划?

EXPLAIN 结果中,几个重要的字段:

字段含义重点
id查询执行的步骤越大表示执行顺序越靠后
type访问类型影响查询效率的关键
possible_keys可能使用的索引可供查询选择的索引
key实际使用的索引如果是 NULL,说明没用索引
rows预计扫描行数值越大说明查询性能越差
Extra额外信息是否 Using indexUsing where; Using index

问题分析:type=index 代表什么?

示例:

EXPLAIN SELECT col1 FROM my_table WHERE col2 = 'xxx';

可能返回:

+----+-------+---------------+----------+--------------------------+
| id | type  | possible_keys | key      | Extra                    |
+----+-------+---------------+----------+--------------------------+
|  1 | index | NULL          | idx_col2 | Using where; Using index |
+----+-------+---------------+----------+--------------------------+

Extra 中 出现 Using where; Using index,意味着:

可能导致查询慢的原因

  1. 索引失效:没有满足最左前缀匹配

    • 复合索引 (a, b, c),如果 WHEREb, c,则索引失效。
    • 建议:调整查询,确保 WHERE 子句符合索引最左匹配原则
  2. 索引筛选性差,导致大量数据扫描

    • 低选择性索引(如 status=1 这种大量重复值)会导致扫描大量行
    • 优化:换更高区分度的列建立索引
  3. 回表查询导致性能下降

    • EXTRA中如果出现Using where; Using index,意味着:

      • 查询需要回表(即索引不覆盖查询列)
    • 优化方案:创建覆盖索引,减少回表操作

      -- 假设查询 `SELECT col1 FROM my_table WHERE col2 = 'xxx'`
      -- 现有索引 idx_col2(col2)
      -- 改进:创建联合索引 (col2, col1) 避免回表
      CREATE INDEX idx_col2_col1 ON my_table (col2, col1);
      
  4. 使用 LIKE '%xx' 或者 函数操作列,导致索引失效

    • WHERE UPPER(name) = 'JOHN' 使得 name 索引失效
    • 解决方案:避免对索引列使用函数,或者考虑创建函数索引

解决方案

问题解决方案
索引未匹配 WHERE调整 SQL 确保最左匹配
索引选择性差选择更具区分度的索引
需要回表查询覆盖索引优化
LIKE '%xx' 导致全索引扫描改进索引或考虑全文索引(FULLTEXT

总结

key 有值但查询仍然很慢:

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]