mysql索引(B+tree)

正确的建合适的索引是提升数据库查询性能的基础

索引是什么

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

为什么要使用索引

  1. 极大的减少存储引擎需要扫描的数据量。
  2. 把随机io变为顺序io。
  3. 帮助我们在进行分组,排序等操作时,避免使用临时表。

为什么是B+tree:

mysql[B-Tree]索引原理及应用

二叉查找树根节点固定,非平衡

mysql[B-Tree]索引原理及应用

特点:树高度深,高度决定io次数,io耗时大

          每个磁盘块(节点/页)保存的数据量太小

                      导致:没有很好的利用操作磁盘io的数据交换特性,和磁盘io的预读能力(空间局部性原理),带来频繁的io操作。

mysql[B-Tree]索引原理及应用

mysql[B-Tree]索引原理及应用

多路:索引列的宽度越小,节点存储的关键字就越多,那么路数就会越多,树高度就笑。

B+Tree与B-Tree的区别

        b+tree为b-tree的加强版(plus版)

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

为什么选用B+Tree

  1. B+树是B树的加强版多路绝对平衡树,拥有B树的优势
  2. 扫库、扫表能力更强
  3. 磁盘读写能力更强
  4. 排序能力更强
  5. 查询效率更加稳定(所有数据的搜索深度一样,都是在叶子节点)

 

mysql中B+Tree的体现形式

myisam索引

        可以知道myisam索引在表文件上会有两个文件分别存储数据和索引

mysql[B-Tree]索引原理及应用

mysql[B-Tree]索引原理及应用

 

innodb索引

mysql[B-Tree]索引原理及应用

 

聚簇索引:数据表行中数据的物理存储顺序与键值的逻辑(索引)顺序一致。

mysql[B-Tree]索引原理及应用

 

辅助索引的叶子节点不直接存储数据的地址值的原因:在数据物理地址发生变化时不需要再维护辅助索引

 

mysql[B-Tree]索引原理及应用

 

应用索引知识

mysql[B-Tree]索引原理及应用

 

联合索引

        节点中关键字:[name,phone]

        单列索引是特殊的联合索引

        联合索引列选择原则:

  1. 经常使用的列优先(最左匹配原则)
  2. 离散性选择性好的列优先(离散度原则)
  3. 宽度小的列优先(最少空间原则)

 

覆盖索引

        查询列可以通过索引节点的关键字直接返回(不用检索到叶子节点),则该索引称之为覆盖索引

        特点:减少io,将随机io变为顺序io,提高查询性能

 

例:

索引:[name,phone]

mysql索引(B+tree)

正确的建合适的索引是提升数据库查询性能的基础

索引是什么

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

为什么要使用索引

  1. 极大的减少存储引擎需要扫描的数据量。
  2. 把随机io变为顺序io。
  3. 帮助我们在进行分组,排序等操作时,避免使用临时表。

为什么是B+tree:

mysql[B-Tree]索引原理及应用

二叉查找树根节点固定,非平衡

mysql[B-Tree]索引原理及应用

特点:树高度深,高度决定io次数,io耗时大

          每个磁盘块(节点/页)保存的数据量太小

                      导致:没有很好的利用操作磁盘io的数据交换特性,和磁盘io的预读能力(空间局部性原理),带来频繁的io操作。

mysql[B-Tree]索引原理及应用

mysql[B-Tree]索引原理及应用

多路:索引列的宽度越小,节点存储的关键字就越多,那么路数就会越多,树高度就笑。

B+Tree与B-Tree的区别

        b+tree为b-tree的加强版(plus版)

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

为什么选用B+Tree

  1. B+树是B树的加强版多路绝对平衡树,拥有B树的优势
  2. 扫库、扫表能力更强
  3. 磁盘读写能力更强
  4. 排序能力更强
  5. 查询效率更加稳定(所有数据的搜索深度一样,都是在叶子节点)

 

mysql中B+Tree的体现形式

myisam索引

        可以知道myisam索引在表文件上会有两个文件分别存储数据和索引

mysql[B-Tree]索引原理及应用

mysql[B-Tree]索引原理及应用

 

innodb索引

mysql[B-Tree]索引原理及应用

 

聚簇索引:数据表行中数据的物理存储顺序与键值的逻辑(索引)顺序一致。

mysql[B-Tree]索引原理及应用

 

辅助索引的叶子节点不直接存储数据的地址值的原因:在数据物理地址发生变化时不需要再维护辅助索引

 

mysql[B-Tree]索引原理及应用

 

应用索引知识

mysql[B-Tree]索引原理及应用

 

联合索引

        节点中关键字:[name,phone]

        单列索引是特殊的联合索引

        联合索引列选择原则:

  1. 经常使用的列优先(最左匹配原则)
  2. 离散性选择性好的列优先(离散度原则)
  3. 宽度小的列优先(最少空间原则)

 

覆盖索引

        查询列可以通过索引节点的关键字直接返回(不用检索到叶子节点),则该索引称之为覆盖索引

        特点:减少io,将随机io变为顺序io,提高查询性能

 

例:

索引:[name,phone]

查询:select name,phone where name=’xxx’

此时只用检索到关键字节点,而不用检索到叶子节点。

总结

mysql[B-Tree]索引原理及应用

like ‘999%’可能用不到索引:检索发现最左匹配原则999选择性不好时就可能直接使用全表扫描。

查询:select name,phone where name=’xxx’

此时只用检索到关键字节点,而不用检索到叶子节点。

总结

mysql[B-Tree]索引原理及应用

like ‘999%’可能用不到索引:检索发现最左匹配原则999选择性不好时就可能直接使用全表扫描。

相关文章: