B Tree

AVL Tree 的进化,一个 Node 上可以储存多个值,充分利用一个 Page 的内存大小(默认16 KB)。
MySQL 索引笔记

B+ Tree

B Tree 的进化,增强了扫表能力,IO性能更好(非叶子节点没有放数据,能够放更多的指针),效率更稳定。
MySQL 索引笔记

五种索引

  • 普通索引:没有限制
  • 唯一索引:每行数据该列唯一,可以为 NULL,可以多个。
  • 主键索引:有且必有一个,不能为 NULL。
  • 联合索引:见下文。
  • 全文索引:用特殊的语法 MATCH、AGAINST 进行搜索。只能用于 CHAR、VARCHAR、TEXT。

聚簇索引

索引的物理顺序与索引键的顺序一致。其实就是主键

  1. 如果有主键,主键就是聚簇索引。
  2. 如果1不成立,找不包含 NULL 的第一个唯一索引为主键和聚簇索引。
  3. 如果1和2不成立,用自动生成的 row_id 作为主键和聚簇索引。

联合索引

键是一种联合的结构。因为这种结构,有最左匹配原则:
index(a, b, c)

  • a 一定要用到(最左一定要用到)
  • 如果要用c,b一定要用到(中间不能断)

如果创建 index(a, b, c)
其实是创建了 index(a) index(a, b) index(a, b, c)
MySQL 索引笔记

辅助索引

除了主键索引外的索引都是辅助索引。只有主键索引的值是数据,辅助索引的值是主键索引的键。
MySQL 索引笔记
查了辅助索引,再去查主键索引的过程,叫回表

覆盖索引

不是一种索引,而是索引的使用情况。即,用到的索引包含了查找的字段。
如上图,如果是 select name from user where name = 'Q';,只需要 name,所以不需要再查主键索引,这种情况就是覆盖索引。

在 explain 里,Extra 列,如果有 Using Index 就代覆盖索引,不用回表。
而 key 列,代表用了什么索引,如,联合索引。

用不到索引

  1. 索引列参与运算,如使用函数、隐式转换等
  2. like 条件前面带%
  3. 负向查询:NOT LIKE、!=、NOT IN

相关文章: