总结来源于Mysql官方小册以及实践: 官方小册地址:dev.mysql.com/doc/refman
性能优化(存储引擎基于InnoDB)
一、性能优化概述
- 数据库层级的优化(软件层级)
- 硬件层级的优化(暂不考虑) 开发人员一般要将重点放在软件层级优化上面,下面优化都是基于软件层面的.
二、Mysql索引组织结构(后续的优化理解都是基于此)
- Mysql是基于索引的数据组织结构
- Mysql InnoDb存储引擎是的数据结构是B+树
2.1 InnoDb存储引擎数据结构为啥是B+树?
合理的数据结构是提升性能的关键,在存储系统中常见的数据结构是哈希算法,二叉树,红黑树(Java-HashMap),B-树,B+树。 那么Mysql为啥要选用B+树呢,接下来我们一一分析上面提到的几个数据结构(按主键索引存储来说明),说明为啥不是其他而是B+树。
-
哈希
按道理来讲,哈希查找是最快的,h(key)=value,时间复杂度为1,当写select语句按主键查找的时候,只需要根据主键计算出哈希值,就可以定位查找到对应的记录,但是,这都是基于均匀的哈希分布,在海量级的数据下,哈希分布均匀是很难的,当哈希分布不均匀的时候,会有多个主键计算出的相同的哈希值,这就产生了哈希碰撞,通常刚解决哈希碰撞的方法是链地址法,可以了理解成是一个单链表,产生哈希碰撞的数据就在一个单链表上排列,这样就得遍历单链表,从而获取数据,当分布极不均匀的情况下,单链表足够长的时候,按主键查询也可能会很慢。这是其一。
再而,哈希计算是无序的,那么它就不适合范围查询。而实际需求中往往有很多范围查询,因此哈希是不合适的
极端情况:哈希值相同
-
二叉树(二叉排序树)
二叉排序树指的是每个节点最多有两个叶子节点,树右面的值大于树左面的值,当有海量数据的时候,二叉树的高度就会很高,极端情况就是,只有右子树。实际中,我们的数据量都是千万级别,甚至是千亿级别,这样使用二叉树存储,树的高度就会很高,通过主键去查询的时候,会遍历很多节点,树的高度月高,IO次数就越多,查询就越慢,因此二叉排序树也不适合
极端情况,只有右子树
-
红黑树
红黑树是自平衡二叉树,它不会出现极端的情况,因为有自平衡的能力,但是本质上它也是二叉树,在千万级别的数据下,树的高度同样很高,这样在查询的时候也需要多次IO,因此它也不合适
-
B-树
B-树,B树可以理解成是多叉树,多叉树可以降低树的高度,减少IO次数,提升查询效率,因此在文件系统中,存储结构一般会选择类似B树的结构,树的高度越低,IO次数越少,查询速度就越快,而Mysql数据库持久化数据就是在文件中,因此Mysql存储引擎一般也是此类的数据结构,那么Mysql为啥没有使用B-树,它和B+树的区别在哪? B-树的每个节点都会存储数据,也就是叶子节点和非叶子节点都会存储数据;而B+树只有叶子节点存储数据,非叶子节点只存储索引值和指针;那么为了节省空间,进而能够存储更多的数据,我们使用B+树,它的非叶子节点只存储索引和指针,只有叶子节点存储数据
-
B+树
经过上面的分析,解释了Mysql-Innodb存储引擎为啥选择了B+树的存储结构 这里分享引用一个网站,它可以动态的模拟各大数据结构,你可以直观的查看查询数据的过程,加深你对数据结构的理解:数据结构
B+树和B-树的存储结构类似,只是存储的数据有所差异,
总结:对于上述的树结构,树的高度越高,磁盘IO就越多,就越耗时,因此涉及文件系统的访问,一般都会使用类似B+树的数据结构,而mysql数据库就是以文件的形式存储的,因此Mysql选择了B+树作为其存储结构