索引

索引是什么?

索引 是为了加速对表中数据行的检索而创建的一种分散存储的数据结构

索引

为什么用索引?

索引能极大的减少 存储引擎需要扫描的数据量
索引 可以把随机IO 变成顺序IO
索引 可以帮助 我们在进行 分组、 排序等操作时,避免 使用临时

二叉查找树

索引

平衡二叉查找树

索引

它太深了
数据处的(高)深度决定着他的IO 操作次数,IO 操作耗时大
它太小了
每一个磁盘块 (节点/ 页) 保存的数据量太小 了
没有很好的利用操作磁盘IO 的数据 交换 特性,
也没有利用好磁盘IO 的预 读能力(空间局部性原理 ),从而带来频繁的IO

多路平衡查找树 B-Tree

索引

加强版多路平衡查找树  B+树

索引

B+Tree与B-Tree的区别

1 ,B+ 节点关键字搜索采用闭合区间
2 ,B+ 非叶节点不保存数据相关信息,只保存关键字和子节点的引用
3 ,B+ 关键字对应的数据保存在叶子节点中
4 ,B+ 叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

为什么选用B+Tree

B+ 树是B- 树的变种(PLUS 版)多路绝对平衡查找树,他拥有B- 树的优势
B+ 树扫库、表能力更强
B+ 树的磁盘读写能力更 强
B+树 树 的排序能力更强
B+ 树的查询效率更加 稳定(仁者见仁、智者见智)

索引列的数据长度能少则少。
索引一定不是越多越好,越全越好,一定是建合适的。
匹配列前缀可用到索引 like 9999%,like %9999%、like %9999用不到索引;
Where 条件中 not in 和 <>操作无法使用索引;
匹配范围值,order by 也可用到索引;
多用指定列查询,只返回自己想到的数据列,少用select *;
联合索引中如果不是按照索引最左列开始查找,无法使用索引;
联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;
联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引;