B Tree
AVL Tree 的进化,一个 Node 上可以储存多个值,充分利用一个 Page 的内存大小(默认16 KB)。
B+ Tree
B Tree 的进化,增强了扫表能力,IO性能更好(非叶子节点没有放数据,能够放更多的指针),效率更稳定。
五种索引
- 普通索引:没有限制
- 唯一索引:每行数据该列唯一,可以为 NULL,可以多个。
- 主键索引:有且必有一个,不能为 NULL。
- 联合索引:见下文。
- 全文索引:用特殊的语法 MATCH、AGAINST 进行搜索。只能用于 CHAR、VARCHAR、TEXT。
聚簇索引
索引的物理顺序与索引键的顺序一致。其实就是主键。
- 如果有主键,主键就是聚簇索引。
- 如果1不成立,找不包含 NULL 的第一个唯一索引为主键和聚簇索引。
- 如果1和2不成立,用自动生成的 row_id 作为主键和聚簇索引。
联合索引
键是一种联合的结构。因为这种结构,有最左匹配原则:
index(a, b, c)
- a 一定要用到(最左一定要用到)
- 如果要用c,b一定要用到(中间不能断)
如果创建 index(a, b, c)
其实是创建了 index(a) index(a, b) index(a, b, c)
辅助索引
除了主键索引外的索引都是辅助索引。只有主键索引的值是数据,辅助索引的值是主键索引的键。
查了辅助索引,再去查主键索引的过程,叫回表。
覆盖索引
不是一种索引,而是索引的使用情况。即,用到的索引包含了查找的字段。
如上图,如果是 select name from user where name = 'Q';,只需要 name,所以不需要再查主键索引,这种情况就是覆盖索引。
在 explain 里,Extra 列,如果有 Using Index 就代覆盖索引,不用回表。
而 key 列,代表用了什么索引,如,联合索引。
用不到索引
- 索引列参与运算,如使用函数、隐式转换等
- like 条件前面带%
- 负向查询:NOT LIKE、!=、NOT IN