跳到主内容

示例:10 个最常见的慢查询原因 ​

慢查询是数据库性能问题最直接的信号。本文逐条列出导致 MySQL 慢查询的高频原因,并给出对应的排查思路。

原因清单 ​

  1. 缺少必要索引:查询条件列无索引,只能全表扫描。用 EXPLAIN 观察 type 是否为 ALL。
  2. 索引失效:对索引列做函数运算、隐式类型转换、前导模糊匹配 LIKE '%xx' 会导致索引无法使用。
  3. 回表过多:SELECT 大量非索引列,二级索引扫描后大量回表。考虑覆盖索引。
  4. 深分页:LIMIT 100000, 20 需扫描并丢弃前 10 万行。改用游标分页(记录上一页末尾主键)。
  5. 大事务与大查询:单次拉取数据量过大,read_rnd_buffer 与网络成为瓶颈。分批拉取。
  6. 锁等待:行锁/间隙锁冲突导致等待。查 information_schema.innodb_trx 定位长事务。
  7. 统计信息过期:优化器选错索引。ANALYZE TABLE 更新统计信息。
  8. join 顺序不优 / 缺 join 索引:被驱动表 join 列无索引,出现 BNLA(Block Nested Loop)。
  9. 参数配置不当:sort_buffer_size、tmp_table_size 过小导致磁盘临时表与磁盘排序。
  10. 数据倾斜:某索引值区分度极低,命中大量行。对低区分度查询改走联合索引或冗余统计表。

排查路径 ​

  • 第一步:slow_query_log + long_query_time 收集样本,用免费慢查询日志分析工具快速聚合 Top SQL。
  • 第二步:对 Top SQL 逐条 EXPLAIN,对照上方原因清单归因。
  • 第三步:改写 SQL 或补索引后回归验证,观察执行时间与扫描行数变化。

提示:更多原因与案例会持续补充到本标签下。