1.什么是索引
索引是DBMS中一种排序的数据结构,用于提升查询效率
2.索引数据结构选型
(1)二叉树
左子树的值一定比父节点小,右子树的值一定比父节点大
缺点:极端情况会退化为链表
(2)平衡二叉树
左右子树的深度差绝对值不超过1
缺点:只有两路,树的深度容易过大
(3)多路平衡二叉树:B树
在平衡二叉树的基础上,每个节点的路数更多
缺点:查找效率不稳定,有时需要遍历整个树
(4)B+树
在B树的基础上优化,只有叶子节点存储数据,每次查找都得到叶子节点,查找效率稳定;并且叶子节点之间有双向链表,可以更快地进行范围查询
为什么不用红黑树?
红黑树的特点:
节点只有红色和黑色;
根节点必须是黑色
叶子节点必须是黑色的NULL节点
一条路径上必须是不同颜色的节点相隔,比如黑色节点的子节点必须是红色,红色节点的子节点必须是黑色
从任意节点出发,到叶子节点的每条路径上必须有相同数量的黑色节点
缺点:路数不够多;不够平衡
3.索引的类型
普通索引:没有任何限制
唯一索引:不能有重复值,可以为NULL,主键索引是特殊的唯一索引,在唯一索引的基础上加了一个不为NULL的条件
全文索引:只能在文本类型的列上建立全文索引,字段比较大时可以使用
4.innodb索引存储方式
索引和数据都存储在ibd文件里面,那么他是怎么检索数据的呢?
如果是聚簇索引(主键索引就是聚簇索引),自己的B+树上就有完整数据,直接查找到返回即可;如果是辅助索引(二级索引,除了聚簇索引剩下的索引都是二级索引),如果要查找的列自己的B+树上没有,就需要回表,到主键索引的B+树上检索数据
一张表没有主键怎么办?聚簇索引的规则?
(1)如果有主键,主键就可以作为聚簇索引
(2)如果没有主键,就找第一个不包含NULL值的唯一索引作为聚簇索引
(3)如果没有这样的唯一索引,就创建一个隐藏的列rowId作为聚簇索引
如何避免回表?
要查找的列都在二级索引树上
什么是索引下推?
把原来要在server层过滤的数据下推到存储引擎层过滤
5.索引建立规则
(1)在散列度高的列上建立索引 (2).在where、order by、group by的列上建立索引 (3).索引的个数不要太多 (4).不要在频繁更新的列上建立索引 (5).在适当的场景考虑建立复合索引,而不是修改单列索引
6.什么时候索引可能会失效
以下场景都是可能,不是一定会失效
(1)使用了函数计算
(2)使用了取反操作
(3)产生了隐式类型转换
(4)like的%放到左边