MySQL索引提高查询效率的原因何在

文 / @WordPress主题

MySQL索引提高查询效率的原因何在?

在数据库优化中,索引是必不可少的一部分。MySQL索引可以看做是一种数据结构,其作用是将数据加载到内存中,从而减少磁盘IO次数,提高查询效率。本文将从计算机加载数据的角度出发,介绍索引的原理和类型。

磁盘IO和预读

磁盘IO是指从磁盘读取数据,其速度比内存操作慢的多。每次磁盘IO都需要进行寻道、寻点和拷贝到内存三步操作。其中寻道时间为将磁臂移动到指定磁道所需的时间,一般在5ms以下;寻点时间为从磁道中找到数据存在的那个点,平均时间是半圈时间,如果是一个7200转/min的磁盘,寻点时间平均是600000/7200/2=4.17ms;拷贝到内存的时间很快,和前面两个时间比起来可以忽略不计,所以一次IO的时间平均是在9ms左右。

为了减少磁盘IO次数,计算机操作系统做了预读的优化。即在一次IO时,不仅把当前磁盘地址的数据读取到内存中,而是把相邻的数据也都读取到内存缓冲区内,因为当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page),一页的大小由操作系统决定,一般为4k或8k。这样可以使每次IO的效率得到最大化的利用。

BTree索引

MySQL的索引本质上是一种数据结构,其中BTree索引是应用最为广泛的一种。一颗m叉的BTree特性如下:树中每个节点最多包含m个孩子。除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子(ceil()为向上取整)。若根节点不是叶子节点,则至少有两个孩子。所有的叶子节点都在同一层。每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1]<=n<=m-1。

BTree索引中的每个节点都可以被看作一个磁盘块或者叫做一个block块。磁盘块中存储了数据的key、data和指针p。每一次查询时,系统会寻找存储该数据的key的磁盘块,然后通过指针p找到下一个磁盘块,知道找到最终存储该数据的磁盘块。这里需要注意的是,每次访问一次磁盘块,都需要进行一次磁盘IO操作,为了减少IO次数,可以通过BTree索引的结构最大化地利用每一次IO,从而提高查询效率。

B+Tree索引

B+Tree索引是在BTree索引基础上的一种优化。在B+Tree索引中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。