Mysql性能优化

307 阅读4分钟

总结来源于Mysql官方小册以及实践: 官方小册地址:dev.mysql.com/doc/refman

性能优化(存储引擎基于InnoDB)

一、性能优化概述

  1. 数据库层级的优化(软件层级)
  2. 硬件层级的优化(暂不考虑) 开发人员一般要将重点放在软件层级优化上面,下面优化都是基于软件层面的.

二、Mysql索引组织结构(后续的优化理解都是基于此)

  • Mysql是基于索引的数据组织结构
  • Mysql InnoDb存储引擎是的数据结构是B+树

2.1 InnoDb存储引擎数据结构为啥是B+树?

合理的数据结构是提升性能的关键,在存储系统中常见的数据结构是哈希算法,二叉树,红黑树(Java-HashMap),B-树,B+树。 那么Mysql为啥要选用B+树呢,接下来我们一一分析上面提到的几个数据结构(按主键索引存储来说明),说明为啥不是其他而是B+树。

  1. 哈希

    按道理来讲,哈希查找是最快的,h(key)=value,时间复杂度为1,当写select语句按主键查找的时候,只需要根据主键计算出哈希值,就可以定位查找到对应的记录,但是,这都是基于均匀的哈希分布,在海量级的数据下,哈希分布均匀是很难的,当哈希分布不均匀的时候,会有多个主键计算出的相同的哈希值,这就产生了哈希碰撞,通常刚解决哈希碰撞的方法是链地址法,可以了理解成是一个单链表,产生哈希碰撞的数据就在一个单链表上排列,这样就得遍历单链表,从而获取数据,当分布极不均匀的情况下,单链表足够长的时候,按主键查询也可能会很慢。这是其一。

    再而,哈希计算是无序的,那么它就不适合范围查询。而实际需求中往往有很多范围查询,因此哈希是不合适的

image.png

极端情况:哈希值相同

image.png

  1. 二叉树(二叉排序树)

    二叉排序树指的是每个节点最多有两个叶子节点,树右面的值大于树左面的值,当有海量数据的时候,二叉树的高度就会很高,极端情况就是,只有右子树。实际中,我们的数据量都是千万级别,甚至是千亿级别,这样使用二叉树存储,树的高度就会很高,通过主键去查询的时候,会遍历很多节点,树的高度月高,IO次数就越多,查询就越慢,因此二叉排序树也不适合

image.png

极端情况,只有右子树

image.png

  1. 红黑树

    红黑树是自平衡二叉树,它不会出现极端的情况,因为有自平衡的能力,但是本质上它也是二叉树,在千万级别的数据下,树的高度同样很高,这样在查询的时候也需要多次IO,因此它也不合适

image.png

  1. B-树

    B-树,B树可以理解成是多叉树,多叉树可以降低树的高度,减少IO次数,提升查询效率,因此在文件系统中,存储结构一般会选择类似B树的结构,树的高度越低,IO次数越少,查询速度就越快,而Mysql数据库持久化数据就是在文件中,因此Mysql存储引擎一般也是此类的数据结构,那么Mysql为啥没有使用B-树,它和B+树的区别在哪? B-树的每个节点都会存储数据,也就是叶子节点和非叶子节点都会存储数据;而B+树只有叶子节点存储数据,非叶子节点只存储索引值和指针;那么为了节省空间,进而能够存储更多的数据,我们使用B+树,它的非叶子节点只存储索引和指针,只有叶子节点存储数据

image.png

  1. B+树

    经过上面的分析,解释了Mysql-Innodb存储引擎为啥选择了B+树的存储结构 这里分享引用一个网站,它可以动态的模拟各大数据结构,你可以直观的查看查询数据的过程,加深你对数据结构的理解:数据结构

B+树和B-树的存储结构类似,只是存储的数据有所差异,

image.png

总结:对于上述的树结构,树的高度越高,磁盘IO就越多,就越耗时,因此涉及文件系统的访问,一般都会使用类似B+树的数据结构,而mysql数据库就是以文件的形式存储的,因此Mysql选择了B+树作为其存储结构

三、sql语句性能优化

3.1 优化select语句

3.2

3.3