外观
示例:10 个最常见的慢查询原因
慢查询是数据库性能问题最直接的信号。本文逐条列出导致 MySQL 慢查询的高频原因,并给出对应的排查思路。
原因清单
- 缺少必要索引:查询条件列无索引,只能全表扫描。用
EXPLAIN观察 type 是否为 ALL。 - 索引失效:对索引列做函数运算、隐式类型转换、前导模糊匹配
LIKE '%xx'会导致索引无法使用。 - 回表过多:SELECT 大量非索引列,二级索引扫描后大量回表。考虑覆盖索引。
- 深分页:
LIMIT 100000, 20需扫描并丢弃前 10 万行。改用游标分页(记录上一页末尾主键)。 - 大事务与大查询:单次拉取数据量过大,
read_rnd_buffer与网络成为瓶颈。分批拉取。 - 锁等待:行锁/间隙锁冲突导致等待。查
information_schema.innodb_trx定位长事务。 - 统计信息过期:优化器选错索引。
ANALYZE TABLE更新统计信息。 - join 顺序不优 / 缺 join 索引:被驱动表 join 列无索引,出现 BNLA(Block Nested Loop)。
- 参数配置不当:
sort_buffer_size、tmp_table_size过小导致磁盘临时表与磁盘排序。 - 数据倾斜:某索引值区分度极低,命中大量行。对低区分度查询改走联合索引或冗余统计表。
排查路径
- 第一步:
slow_query_log+long_query_time收集样本,用免费慢查询日志分析工具快速聚合 Top SQL。 - 第二步:对 Top SQL 逐条
EXPLAIN,对照上方原因清单归因。 - 第三步:改写 SQL 或补索引后回归验证,观察执行时间与扫描行数变化。
提示:更多原因与案例会持续补充到本标签下。