Mysql索引底层原理与性能优化
在一般的开发中不会有碰到数据结构、算法的一些底层东西。但是了解了之后会对你的开发有很大的帮助。最近学习了一下。做一个笔记。更深的学习,请看相关书籍或视频。
一、索引是帮助Mysql高效获取数据的排好序的数据结构
二、索引的数据结构
- 二叉树
- 红黑树
- Hash表
- B-Tree
- B+Tree
1、二叉树
如图(一个二叉树插入的过程):
有一个根节点,有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。左侧的节点永远比右侧的要小。
如图(查找数据)
查找数据,如果按插入顺序查询要7步(因为是最后一个插入的),二叉树了3步查出结果。比顺序结构快了很多。但是有一个问题,如果是数据是顺序递增。那就会变为链表,那索引就无效了。那么就出现了红黑树
如图:
2、红黑树
如图:(红黑树的插入过程)
所以,红黑树又是二叉树的升级版,是特化平衡二叉树。但是在数据量大的时候树的高度就会增加,然后会导致IO过程多,查询速度会减慢些。
3、Hash表
是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
简单说就是有一个表存着一个值得算出来的hash值,和对应的数据地址,查询很快。但是有个缺点,如果查询大于小于的数据时候就不行了。所以有一定的局限。
4、B-Tree
B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树。简单点说就是一个节点可以有多个分叉。这样可以减少树的高度从而减少IO磁盘。
如图(B-Tree插入过程):
上面说了这么多其实都是在铺垫。Mysql索引底层用的是B+Tree和Hash表(可以选择)。B+Tree又是啥。B+Tree是B-Tree的优化版。其实上面的说的数据和索引都是在一个节点存储。B+Tree,是把数据都放到了叶子节点,上面都是索引,这样就可以减少节点的存储空间,而来增加的每个节点的索引数量。叶子节点就是它的所有存储数据。
5、B+Tree
如图(B+插入过程):
三、存储引擎
聚集索引:
聚集索引-叶节点包含了完整的数据记录。就是说索引和数据是在一个文件存储(如:InnoDB引擎)
非聚集索引:
非聚集索引就是索引和数据不在一个文件存储。索引有索引的文件对应的数据的地址。数据是数据的文件。(如:MyISAM引擎)
四、性能优化优化
为什么InnoDB表必须有主键,并且推荐使用整形的自增主键?
1、InnoDB表文件本身就是按B+Tree组织的一个索引结构文件,所谓要有主键。如果表没有设计主键那么Mysql表中找一列,如果没找到会在后台默认加一个看不见的主键。
2、整形的比较会更快,自增会避免在插入数据时在数据的中间插入破坏结构。