为什么需要索引
- 索引的顺序性
- 快速查找、排序、分组
- 减少扫表数量,避免创建临时表,将随机IO变为顺序IO
B-Tree
- MySQL的Btree实际上是balance tree基础上做了小改动,每个叶子节点都有一个指向后一个叶子节点的指针。
聚簇索引
- 聚簇并不是一种单独的索引类型,而是一种存储方式:InnoDB的聚簇索引在同一个结构中保存了B-Tree索引和行数据,索引就是主键。而覆盖索引也是相同的模型。
高性能索引
三星级索引
- 一星:要查找的记录放在一起
- 二星:多列索引的顺序与查找条件顺序一致
- 三星:覆盖索引
选择性
- 定义:不重复的列数量与所有列数量的比值,最大值为1
- 对于BLOG、TEXT、长varchar,虽然选择性很高,但mysql不允许如此大的字段,只能使用前缀索引
- 正常情况下,多列索引应该将选择性高的列放到前面
什么情况下无法使用索引
索引使用案例
SQL分析
- explain
- type列:官方的说法,说这列表示的是“访问类型”,更通俗一点就是:mysql找到需要的数据行的方式,由差到好:All(扫全表),index(使用索引扫全表),range(使用索引范围查询),ref(使用索引返回一行数据),const(主键查询)。
- extra列:Only index:使用到了索引;Where used:使用到了where限制;Using filesort使用了全文排序;Using temporary使用到了临时表。当extra里显示有using filesort或using temporary时,sql的执行就会很吃力,时间就会增加。
- keys列:使用到的索引
- rows列:扫描的行数