mysql索引(B+tree)
正确的建合适的索引是提升数据库查询性能的基础
索引是什么
为了加速对表中数据进行检索而创建的一种分散存储的数据结构。
为什么要使用索引
- 极大的减少存储引擎需要扫描的数据量。
- 把随机io变为顺序io。
- 帮助我们在进行分组,排序等操作时,避免使用临时表。
为什么是B+tree:
二叉查找树根节点固定,非平衡
特点:树高度深,高度决定io次数,io耗时大
每个磁盘块(节点/页)保存的数据量太小
导致:没有很好的利用操作磁盘io的数据交换特性,和磁盘io的预读能力(空间局部性原理),带来频繁的io操作。
多路:索引列的宽度越小,节点存储的关键字就越多,那么路数就会越多,树高度就笑。
B+Tree与B-Tree的区别
b+tree为b-tree的加强版(plus版)
- B+Tree节点关键字采用闭合区间
- B+Tree非叶子节点不保存数据相关信息,只保存关键字和子节点的引用
- B+Tree关键字对应的数据都保存在叶子节点
- B+Tree叶子节点是顺序排序,且相邻节点具有顺序引用的关系
为什么选用B+Tree
- B+树是B树的加强版多路绝对平衡树,拥有B树的优势
- 扫库、扫表能力更强
- 磁盘读写能力更强
- 排序能力更强
- 查询效率更加稳定(所有数据的搜索深度一样,都是在叶子节点)
mysql中B+Tree的体现形式
myisam索引
可以知道myisam索引在表文件上会有两个文件分别存储数据和索引
innodb索引
聚簇索引:数据表行中数据的物理存储顺序与键值的逻辑(索引)顺序一致。
辅助索引的叶子节点不直接存储数据的地址值的原因:在数据物理地址发生变化时不需要再维护辅助索引
应用索引知识
联合索引
节点中关键字:[name,phone]
单列索引是特殊的联合索引
联合索引列选择原则:
- 经常使用的列优先(最左匹配原则)
- 离散性选择性好的列优先(离散度原则)
- 宽度小的列优先(最少空间原则)
覆盖索引
查询列可以通过索引节点的关键字直接返回(不用检索到叶子节点),则该索引称之为覆盖索引
特点:减少io,将随机io变为顺序io,提高查询性能
例:
索引:[name,phone]
mysql索引(B+tree)
正确的建合适的索引是提升数据库查询性能的基础
索引是什么
为了加速对表中数据进行检索而创建的一种分散存储的数据结构。
为什么要使用索引
- 极大的减少存储引擎需要扫描的数据量。
- 把随机io变为顺序io。
- 帮助我们在进行分组,排序等操作时,避免使用临时表。
为什么是B+tree:
二叉查找树根节点固定,非平衡
特点:树高度深,高度决定io次数,io耗时大
每个磁盘块(节点/页)保存的数据量太小
导致:没有很好的利用操作磁盘io的数据交换特性,和磁盘io的预读能力(空间局部性原理),带来频繁的io操作。
多路:索引列的宽度越小,节点存储的关键字就越多,那么路数就会越多,树高度就笑。
B+Tree与B-Tree的区别
b+tree为b-tree的加强版(plus版)
- B+Tree节点关键字采用闭合区间
- B+Tree非叶子节点不保存数据相关信息,只保存关键字和子节点的引用
- B+Tree关键字对应的数据都保存在叶子节点
- B+Tree叶子节点是顺序排序,且相邻节点具有顺序引用的关系
为什么选用B+Tree
- B+树是B树的加强版多路绝对平衡树,拥有B树的优势
- 扫库、扫表能力更强
- 磁盘读写能力更强
- 排序能力更强
- 查询效率更加稳定(所有数据的搜索深度一样,都是在叶子节点)
mysql中B+Tree的体现形式
myisam索引
可以知道myisam索引在表文件上会有两个文件分别存储数据和索引
innodb索引
聚簇索引:数据表行中数据的物理存储顺序与键值的逻辑(索引)顺序一致。
辅助索引的叶子节点不直接存储数据的地址值的原因:在数据物理地址发生变化时不需要再维护辅助索引
应用索引知识
联合索引
节点中关键字:[name,phone]
单列索引是特殊的联合索引
联合索引列选择原则:
- 经常使用的列优先(最左匹配原则)
- 离散性选择性好的列优先(离散度原则)
- 宽度小的列优先(最少空间原则)
覆盖索引
查询列可以通过索引节点的关键字直接返回(不用检索到叶子节点),则该索引称之为覆盖索引
特点:减少io,将随机io变为顺序io,提高查询性能
例:
索引:[name,phone]
查询:select name,phone where name=’xxx’
此时只用检索到关键字节点,而不用检索到叶子节点。
总结
like ‘999%’可能用不到索引:检索发现最左匹配原则999选择性不好时就可能直接使用全表扫描。
查询:select name,phone where name=’xxx’
此时只用检索到关键字节点,而不用检索到叶子节点。
总结
like ‘999%’可能用不到索引:检索发现最左匹配原则999选择性不好时就可能直接使用全表扫描。