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
索引的弊端
- 创建和维护索引要耗费时间。数据量越大,花的时间越长。
- 除了数据表占数据空间之外,每一个索引还要占一定的物理空间。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,降低了数据的维护速度。
创建索引需要注意什么
-
在经常需要查找的列上建立索引,可以加快搜索的速度。
-
在经常需要根据范围进行查找的列上创建索引,因为索引已经排序,所以其指定的范围是连续的。
-
在经常使用 where子句的列上创建索引,加快条件的判断速度。
-
在经常使用表连接的列上创建索引,可以加快表连接的速度。
-
在经常需要排序的列上创建索引,因为索引已经排序,所以查询时可以利用索引的排序,加快排序查询。
-
主键最好是趋势递增的。
309

被折叠的 条评论
为什么被折叠?



