- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
那些年被面试官怼的MySQL索引
2021-05-14
之前有过一次面试,关于MySQL索引的原理及使用被面试官怼的体无完肤,立志要总结一番,然后一直没有时间(其实是懒……),预备好了吗?
索引是什么?
数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,它可以对数据库表中一列或多列的值进行排序,以帮忙愈加快速的访问数据库表中特定的数据。通俗的说,我们可以把数据库索引比做是一本书前面的名目,它能加快数据库的查询速度。
为什么需要索引?
思考:如何在一个图书馆中找到一本书?设想一下,假如在图书馆中没有其他协助手段,只能一条道走到黑,一本书一本书的找,经过3个小时的连续查找,最终找到了你需要看的那本书,但此时天都黑了。为了避开这样的事情,每个图书馆才都配备了一套图书馆管理系统,大家要找书籍的话,先在系统上查找到书籍所在的房屋编号、图书架编号还有书在图书架几层的那个方位,然后就可以直接大摇大摆的去取书了,就可以很快速的找到我们所需要的书籍。索引就是这个原理,它可以挂念我们快速的检索数据。
一般的应用系统对数据库的操作,遇到最多、最简约出问题是一些简单的查询操作,当数据库中数据量很大时,查找数据就会变得很慢,这样就很影响整个应用系统的效率,我们就可以使用索引来提高数据库的查询效率。
B-Tree和B+Tree
目前大部分数据库系统及文件系统都接受B-Tree或其变种B+Tree作为索引结构,?我在这里分别讲一下:
B-Tree
即B树,留意(不是B减树),B树是一种多路搜索树。使用B-Tree结构可以显著削减定位记录时所经受的两头过程,从而加快存取速度。
B-Tree有如下一些特征:?
定义任意非叶子结点最多只要M个子节点,且M2。
根结点的儿子数为[2, M]。
除根结点以外的非叶子结点的儿子数为[M/2, M],?向上取整?。
每个结点存放至少M/2-1(取上整)和至少M-1个关键字;(至少2个关键字)。
非叶子结点的关键字个数=指向儿子的指针个数-1。
非叶子结点的关键字:K[1], K[2], …, K[M-1],且K[i] = K[i+1]。
非叶子结点的指针:P[1], P[2], …,P[M](其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树)。
全部叶子结点位于同一层。
有关b树的一些特性:
关键字集合分布在整颗树的全部结点之中;
任何一个关键字消灭且只消灭在一个结点中;
搜索有可能在非叶子结点结束;
其搜索功能等价于在关键字全集内做一次二分查找。
B树的搜索:从根结点开头,对结点内的关键字(有序)序列进行二分查找,假如命中则结束,否则进入查询关键字所属范围的儿子结点;反复执行这个操作,直到所对应的节点指针为空,或者已经是是叶子结点。
例如下面一个B树,那么查找元素43的过程如下:
依据根节点指针找到18、37所在节点,把此节点读入内存,进行第一次磁盘IO,此时发觉4337,找到指针p3。
依据指针p3,找到42、51所在节点,把此节点读入内存,进行其次次磁盘IO,此时发觉424351,找到指针p2。
依据指针p2,找到43、46所在节点,把此节点读入内存,进行第三次磁盘IO,此时我们就已经查到了元素43。
在此过程总共进行了三次磁盘IO。
B+Tree
B+Tree属于B-Tree的变种。与B-Tree相比,B+Tree有以下不同点:
有n棵子树的非叶子结点中含有n个关键字(B树是n-1个),即非叶子结点的子树指针与关键字个数相同。这些关键字不保存数据,只用来索引,全部数据都保存在叶子节点(B树是每个关键字都保存数据)。
全部的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大挨次链接。
全部的非叶子结点可以看成是叶子节点的索引部分。
同一个数字会在不同节点中反复消灭,根节点的最大元素就是b+树的最大元素。
相对B树,B+树做索引的优势
B+树的磁盘IO代价更低:?B+树非叶子节点没有指向数据行的指针,所以相同的磁盘容量存储的节点数更多,相应的IO读写次数确定削减了。
B+树的查询效率愈加稳定:由于全部数据都存于叶子节点。全部关键字查询的路径长度相同,每一个数据的查询效率相当。
全部的叶子节点构成了一个有序链表,愈加便于查找。
关于MySQL的两种常用存储引擎MyISAM和InnoDB的索引均以B+树作为数据结构,二者却有不同(这里只说二者索引的区分)。
?MyISAM索引和Innodb索引的区分
MyISAM使用B+树作为索引结构,叶节点叶节点的data域保存的是存储数据的地址,主键索引key值独一,协助索引key可以反复,二者在结构上相同。?因而
文档评论(0)