码迷,mamicode.com
首页 > 数据库 > 详细

Mysql索引

时间:2018-07-26 21:15:10      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:遍历   article   分组   增加   资料   速度   src   情况   16px   

前言:Mysql有hash索引和btree索引两种方式,

一、先说明下操作系统的相关内容

数据库数据是保存在磁盘上的,为了提高性能,每次又可以把部分数据读入内存来计算。把磁盘中的数据读取到内存中就叫磁盘IO,每次IO把当前磁盘地址中的数据和相邻磁盘地址中的数据读取到内存缓冲区,每次IO读取的数据称为一页(page),具体一页有多大跟操作系统有关,一般为4k或8k。磁盘块是文件系统读写数据的最小单位;页是内存的最小存储单位;数据库系统的设计者巧妙利用了磁盘预读原理,每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

 

 二、下图是一个简单的B+Tree示意。

技术分享图片

如图所示,B+树就是叶子节点存储完整的数据(聚集索引),非叶子节点只存储索引。如果要查找数据项30,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定30在15和56之间,锁定磁盘块1的P1指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P1指针的磁盘地址把磁盘块2由磁盘加载到内存,发生第二次IO,30在20和49之间,锁定磁盘块2的P2指针,通过指针加载磁盘块4到内存,发生第三次IO,同时内存中做二分查找找到30,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的。但是是怎么通过指针查找到磁盘块的我就不知道了。。。

多列索引非叶子节点存的是index(a,b,c)中最左边的那个,所以要遵循最左匹配原则。最左匹配到之后再怎样网上说的不太清楚,我还没有研究。。。

三、为什么使用B+树

Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。另一个优点是什么,B+树所有的Data在叶子节点,所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。

四、哈希索引

技术分享图片

 

简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;

在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。

备注:参考资料,以上如有问题,感谢指出

https://blog.csdn.net/qq_33599978/article/details/78368660

https://blog.csdn.net/ligupeng7929/article/details/79529072

 

Mysql索引

标签:遍历   article   分组   增加   资料   速度   src   情况   16px   

原文地址:https://www.cnblogs.com/ziduan/p/9373934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!