面试知识库

MySQL 索引 → 慢SQL → 优化实战 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. B+树优势:3层B+树(16KB页, bigint主键)可存 ~2000万行,只需3次磁盘IO
  2. 回表代价:每次回表是一次随机IO,覆盖索引将随机IO变为顺序IO
  3. 索引设计:遵循 ESR 原则(Equal → Sort → Range)设计联合索引
  4. 慢SQL排查链slow_query_logexplain → 索引优化 → SQL改写 → 压测验证
  5. 深分页本质LIMIT offset, size 会扫描 offset+size 行然后丢弃前 offset
  6. 代码示例
    -- 延迟关联优化深分页
    SELECT * FROM orders o
    INNER JOIN (SELECT id FROM orders ORDER BY create_time LIMIT 100000, 10) t
    ON o.id = t.id;
    sql

面试回答串联#

30秒速答#

“B+树3层可存2000万行,叶子链表支持范围查询。二级索引查完需要回表取数据,用覆盖索引可以避免。联合索引遵循最左前缀原则,函数、隐式转换、like左模糊会导致索引失效。慢SQL用explain的type和rows字段定位瓶颈。“

2分钟展开答#

“MySQL用B+树索引是因为矮胖结构减少磁盘IO——3层约存2000万行,只需3次IO。InnoDB的聚簇索引叶子存完整数据行,二级索引叶子存主键值,所以二级索引查询后需要回表再取数据。覆盖索引让查询列都在索引中,把随机IO变顺序IO。联合索引设计遵循ESR原则:等值条件放前面,排序字段放中间,范围条件放最后。索引失效常见于对列用函数、varchar和int比较导致隐式转换、like左模糊等场景。生产中我的慢SQL排查流程是:先开慢日志定位(long_query_time=1s),explain看type至少要到range、检查rows扫描行数、Extra中的Using filesort和Using temporary,然后针对性加索引或改写SQL。深分页用延迟关联——子查询先走覆盖索引取主键,再join回原表取数据。大表DDL用gh-ost无触发器方案避免锁表。“

相关追问链#