Mysql性能优化之索引

Mysql性能优化中重要的一种方式就是建立索引,在使用WHERE条件查询的时候,如果是根据索引来查询,那么速度就非常快,那么为什么寄哪里索引后会提高如此高的效率呐?

mysql

通过查询相关资料,了解到索引实则一种加快查询速度有序的数据结构,现在Mysql索引的实现依赖于B+

0x00 磁盘IO

数据库的数据存储于'mysql/data/'目录下,即数据就是文件

数据库存储的文件

学习过计算机组成原理的同学都知道,既然是文件,那么SQL查询的其实就是读取文件数据来查找的

数据在磁盘上存储位置并不是连续的,

当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。再加上磁盘传输数据的时间,整个就是一次磁盘IO

磁盘读取是按照页进行预读,当一个数据被用到时,其附近的数据也通常会马上被使用。

Mysql是关系型数据库,类似于一张二维表结构,如果没有索引,那么一个WHERE条件查询就需要遍历整个数据表

比如100条数据,可以认为是100次磁盘I/O,这样的效率也就太低了,因此我们需要优化!


0x01 为什么不用二叉树

二叉树的特性是左边节点比父节点小,父节点小于右子节点

如果索引是基于二叉树,那么就会有如下的问题:

  • 如果索引是连续有序的序列,那么二叉树的高度正好等于序列个数,单边增长

0x02 Red/Black Tree

红黑树是一种特殊的二叉查找树,通过自身的旋转,来调节树的构建

红黑树已经可以避免普通二叉树中的“单边增长”问题,但是其没有限制树的高度,例如2000万数据,那么这棵红黑树的高度大约为25层,也就是25次IO,那么还有没有更好的方法呐?


0x03 B/B+ Tree

B Tree

B+Tree

myisam

Innodb

根据最左前缀原则,我们一般把排序分组频率最高的列放在最左边,以此类推。


0xFF 参考文章

发表评论 / Comment

用心评论~

金玉良言 / Appraise
DYBOY站长已认证
2019-09-02 12:07
www.cs.utca.edu/~galles