Mysql索引二(白话文)
📅 2026/7/24 18:40:03
👁️ 阅读次数
📝 编程学习
B树和B+树的区别
B树:一个节点是一个数组,数组中数据是键值对
- 比如:创建user表用户ID和姓名二级索引,内部节点存的是:[{id:1,name:张三},{id:2,name:李四}]
- 注意:这是普通索引,如果是聚簇索引,内部节点存的是:[{id:1, name:‘张三’, 其他列…},{id:2, name:‘李四’, 其他列…} ]
- 参考下图,每个方框就是一个节点(数组),每个数字就是一个key:value键值对
B+树:一个节点依旧是一个数组,数组中数据是键值对,多了一个“最下层节点(子节点)”
- 比如:创建user表用户ID和姓名二级索引,内部节点存的是:[{id:1,name:张三+子节点指针},{id:2,name:李四+子节点指针}]
- 注意:不管是二级索引还是聚簇索引,内部节点都不会存整行数据。
- 叶子节点:如果是聚簇索引存整行数据,二级索引存索引字段数据
- 参考下图:内部节点,最后一层(叶子节点)
- B+树的叶子节点会按顺序链接在一起,非常时候适合范围查找
- 总结:
最后一层称叶子节点,上面称内部节点
回表问题
回表就是查询一棵树不够,要在查询一棵树。一张表一定只能有一颗聚簇索引树,节点存每行数据。你想一下现在有这样一张表:
- 现在只有一颗id字段的聚簇索引树,我查询所有字段字段,条件和id有关,mysql走聚簇索引
- 现在只有一颗id字段的聚簇索引树,我查询所有字段字段,条件和id无关,mysql全盘扫描
- 现在加了一个name二级索引index_n,你查询name字段,条件和id有关,mysql直接走index_n索引就完事,
- 你查询name字段,条件和id,name无关,全盘扫描
- 查询所有字段,条件和name有关,mysql先从二级索引index_n中找到数据id,再去聚簇索引获取整行数据,回表
总结:回表要看,查询字段,条件字段两个,回表是比较慢的。
帮我画个图贴在评论区,谢谢
Mysql优化(针对索引)
- 覆盖索引:尽量让 SELECT 的字段全部包含在某个索引中,避免回表。
- 区分度高的列放前面:能过滤掉更多数据的列,在联合索引中越靠前越好。
- 避免索引失效:在索引列上做计算、用函数、类型隐式转换,都会导致索引失效。
- 最左前缀原则:联合索引 (a, b, c),查询条件必须从 a 开始,才能用上索引。
具体案例可以ai,我也是ai的 - 用 EXPLAIN 验证优化效果
- 注意:致命错误:给所有列都建索引,主键用 UUID 或长字符串
最左匹配原则
特指联合索引,索引 (a, b, c),但 WHERE b = 1 AND c = 2,就不会走索引。因为索引树:a 相同的情况下按 b 排序,b 也相同的情况下再按 c 排序。
- 先以b搜索,无序的索引,没办法走索引
总结
了解索引的优缺点,下一篇介绍
1)mysql锁概念
想了解的任意内容打在评论区,一起讨论
编程学习
技术分享
实战经验