MySQL 索引原理与优化实战

面试必考,工作必用。索引这个话题说简单也简单,说复杂也复杂。这篇文章尝试把最实用的部分说清楚。 B+ 树索引的工作原理 MySQL InnoDB 的索引底层是 B+ 树。B+ 树的特点: 所有数据存在叶子节点 叶子节点之间用链表相连(支持范围查询) 非叶子节点只存键值,不存数据(让每层能存更多节点) 这意味着一次查询最多只需要走 树高 次 IO。对于千万级的表,B+ 树高度通常只有 3-4 层,也就是 3-4 次 IO 就能找到数据。 聚簇索引 vs 二级索引 聚簇索引(主键索引):叶子节点直接存行数据。 二级索引(普通索引):叶子节点存的是主键值,查到后还需要回表(再走一次聚簇索引)。 -- 走二级索引,需要回表 SELECT * FROM users WHERE name = 'Kada'; -- 覆盖索引,不需要回表(索引包含了所有需要的字段) SELECT id, name FROM users WHERE name = 'Kada'; 覆盖索引是避免回表的常用技巧,查询的字段都在索引里,就不用回表了。 联合索引的最左前缀原则 -- 建了联合索引 (a, b, c) CREATE INDEX idx_abc ON t (a, b, c); -- 能用到索引 WHERE a = 1 WHERE a = 1 AND b = 2 WHERE a = 1 AND b = 2 AND c = 3 -- 不能用到索引(跳过了 a) WHERE b = 2 WHERE c = 3 WHERE b = 2 AND c = 3 联合索引按最左前缀匹配,中间不能断。 ...

2020-06-18 · 2 min · Kada Liao