MySQL 索引笔记

B Tree

AVL Tree 的进化,一个 Node 上可以储存多个值,充分利用一个 Page 的内存大小(默认16 KB)。
在这里插入图片描述

B+ Tree

B Tree 的进化,增强了扫表能力和范围查询能力,IO性能更好(非叶子节点没有放数据,能够放更多的指针),效率更稳定。
在这里插入图片描述

五种索引

  • 普通索引:没有限制
  • 唯一索引:每行数据该列唯一,可以为 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)
在这里插入图片描述

辅助索引

除了主键索引外的索引都是辅助索引。只有主键索引的值是数据,辅助索引的值是主键索引的键。
在这里插入图片描述
查了辅助索引,再去查主键索引的过程,叫回表

覆盖索引

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

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

用不到索引

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

索引的弊端

  1. 创建维护索引要耗费时间。数据量越大,花的时间越长。
  2. 除了数据表占数据空间之外,每一个索引还要占一定的物理空间
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,降低了数据的维护速度

创建索引需要注意什么

  1. 在经常需要查找的列上建立索引,可以加快搜索的速度。

  2. 在经常需要根据范围进行查找的列上创建索引,因为索引已经排序,所以其指定的范围是连续的。

  3. 在经常使用 where子句的列上创建索引,加快条件的判断速度。

  4. 在经常使用表连接的列上创建索引,可以加快表连接的速度。

  5. 在经常需要排序的列上创建索引,因为索引已经排序,所以查询时可以利用索引的排序,加快排序查询。

  6. 主键最好是趋势递增的。

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页