MySQL性能调优(1)索引的数据结构

一般的生产环境中,对数据库读的操作远远大于写的操作,而且插入操作和一般的更新操作很少出现性能问题,我们遇到最多的问题,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。而对查询的优化,最容易想到的便是给字段加索引,这涉及到了如何加索引,加什么索引,怎么进行索引优化等一系列问题,解决这些问题之前我们需要先学习索引的底层数据结构,从底层去解决问题。

索引用一句话概括,就是排好序的数据结构

索引的数据结构

(1)二叉搜索树

说到排好序的数据结构,最容易想到的就是二叉搜索树了,如下图:
MySQL性能调优(1)索引的数据结构_第1张图片

利用二叉搜索树左小右大的特点,可以将平均每次搜索时间降为O(logn)。但是它有个缺点,如果插入的数据是从小到大排列时,那么它的形状会变为一个链表,它的搜索的时间复杂度又会变为O(n),如下图:
MySQL性能调优(1)索引的数据结构_第2张图片

(2)红黑树

红黑树是一种平衡二叉树,当数据从小到大依次插入时红黑树不会形成一个链表,而是进行了一系列平衡操作(变色、旋转),如下图:
MySQL性能调优(1)索引的数据结构_第3张图片
虽然红黑树解决了二叉搜索树的问题,但是如果当数据特别多时,红黑树的高度h也会变得很高。而数据库的数据都是存于磁盘中的,每次对一个节点的查找,需要从磁盘加载到内存,进行一次I/O操作,这种操作是比较费时的。所以,当h增大时,意味着进行的I/O操作变多,也就会导致性能变低。

(3)B-TREE(B树)

为了减少I/O操作,很容易想到的就是让一个节点多从磁盘中读取一些数据并排好序,这样就形成了一颗B-TREE,如下图:

MySQL性能调优(1)索引的数据结构_第4张图片

可以看到,每个节点存储了多个索引和数据,这样大大减少了树的高度,也就减少了I/O操作的次数。但是B树还是有些问题,比如由于每个节点的存储大小都是固定的,但是B树每个节点都是存有索引和数据的,如果数据很大(字段很多),那么每个节点所能装下的节点数量也就很少了,那么这又会导致树的高度增大。又比如进行范围查找,那么每查到一个数据又要从根节点重新查找下一条数据,比较费时。

(4)B+TREE(B+树)

通过对B树缺点进行优化,最终形成了B+树,B+树结构如下:

MySQL性能调优(1)索引的数据结构_第5张图片
可以看到非叶子节点只存储了索引,而数据大部分存放在叶子节点上,这样非叶子节点可存储的索引数大大提升,树的高度进一步下降(B+树的高度一般小于3),性能也就提高了。此外,不同叶子节点间有双向指针连接,这样进行范围查询时可以通过指针直接查询,大大提高了查询速度。

(5)Hash表

其实MySQL索引除了B+树,还有一个较少使用的Hash表。原理是将数据进行Hash运算,将 Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表,再查找时则只需查找对应的Hash值即可,速度是非常快的。

但是由于Hash存储是无序存储的,所以范围查找时会导致重复扫描,效率也比较低,所以只适用于特定的场合,用处较少。

你可能感兴趣的:(MySQL性能调优,mysql,数据库)