Mysql性能优化中重要的一种方式就是建立索引,在使用WHERE条件查询的时候,如果是根据索引来查询,那么速度就非常快,那么为什么寄哪里索引后会提高如此高的效率呐?
通过查询相关资料,了解到索引实则一种加快查询速度有序的数据结构,现在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
根据最左前缀原则,我们一般把排序分组频率最高的列放在最左边,以此类推。
0xFF 参考文章
云服务器上安装MSF环境
浅谈XSS绕过
版权声明:《 Mysql性能优化之索引 》为DYBOY原创文章,转载请注明出处!
最后编辑:2019-9-2 08:09:33
2019-09-30 06:37
2019-09-30 06:37
2019-09-02 12:07