BTree索引
BTree分为两种形式:B-Tree和B+Tree,B+Tree的叶子节点之间是单项联通的
B+Tree树的结构特点如下
- Max.Degree表示当前的每个节点包含的元素数量
- 是一个平衡树
- 数据由左至右由小变大
- 深度没有上限(和表的大小有关)
如下图所示:
image.png
数据库中BTree的的特性说明
- 使用逻辑页的概念来作为一个子节点的元素
- InnoDB的逻辑页的大小是16K
- 索引列按顺序存储
- 索引对多个值的排序是按照CREATE TABLE语句定义的索引时列的顺序
- 前缀查找只适用于最左前缀查找
聚簇索引
表就是聚簇索引,innodb的表组织方式
覆盖索引
查询的列全部来自索引,而不是通过二级索引去找了对应的行数据
二级索引
Innodb的行数据和主键进行关联,在使用BTree索引查询数据时,如果没有走覆盖索引那么就会去找当前BTree索引找到主键,然后根据主键去找当前数据行
使用索引的查询类型
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精准匹配某一列并范围匹配另外一列
- 只访问索引的查询(覆盖索引)
- 索引还可以用在ORDER BY中
- 如果不使用最左前缀则无法使用索引
- 索引不能跳过索引列,例如有三个列组成的索引,如果使用了第一列还有第三列,则第三列无法作为索引使用
索引失效原因
- 最左前原则:索引是后者建立索引时的字段顺序来安排索引顺序的,无法跳过前面的索引列直接使用后面的索引列
- 有针对当前索引的范围查询,范围查询的情况下后续索引列将不在生效
- 使用不等于(!=或<>),需要注意<> 和 <=>效果不一样前者不走索引后者可以
- 索引所在的列添加参数函数如:data_format(insert_timestamp, '%Y%m%i')
哈希索引
最完美的哈希索引就是直接一条记录一个索引,Innodb的主键约束就是哈希索引;Memory引擎支持非唯一哈希索引。
R-Tree索引
目前MyISAM引擎的支持的一种索引类型,没有最左前缀的限制,可以全方位使用索引