mysql那点事儿(一)

2017-10-29  本文已影响0人  神奇的考拉

在实际应用中,索引是提供查询性能的重要途径之一。但也并不是意味着所建的索引越多越好,过多的索引会导致过高的磁盘使用率和过多的内存占用率。

索引尽量避免事后添加,此时添加索引的成本远高于设计之初。

那么作为在关系型数据库占据很大比重的mysql索引又是如何的呢?接下来将以mysql为例,讲述创建高性能索引的策略,以及其背后的工作原理【涉及数据结构和算法】

概论

常说索引一般都是B-Tree索引,它也是关系型数据库查询数据最为常见和有效的索引。不过在mysql中不同的存储引擎会使用不同的数据结构,比如innodb使用的是B+Tree(也称之为平衡树,与常说的二叉树是有差异的),实际上B+Tree索引指向并不是具体的数据行,而是数据行所在的数据页。

页是计算机管理存储器的逻辑块,硬件及OS通常将主存和磁盘存储分割为连续大小相等的块,每个存储块即为页。

在存储系统中主存和磁盘都是以页来完成数据交换的。当程序需要的数据不存在主存,会向磁盘发出读盘信号,接下来就会将需要读取的数据所在的页甚至都读入到主存中,最后程序返回所有的数据。

一般在读盘过程中,并不是仅仅将需要的数据所在的数据页读入即可,而是将当前数据页甚至后续的好几页数据也一并读入,这就是数据预读取。减少读盘的损耗,以及充分利用主存的优势。

索引

经过两次分裂的最终二叉树.png

前面也提到B+Tree是平衡树,这样针对新插入的值都需要大量的拆分页的操作,进而带来的io消耗也是比较严重的。针对这个问题mysql使用类旋转的方式来规避

后记

更多内容可以借鉴<<高性能mysql>>

上一篇 下一篇

猜你喜欢

热点阅读