Mysql第二篇:索引的原理和优化

索引在数据库中的作用一般是用来加快查询,但是我们虽然会用但是要理解原理,才能更好的应用。

1 索引的定义:索引是帮助Mysql高效获取数据的排好序的数据结构。

2 索引的存储结构:二叉树、红黑树、hash表、b-tree。

3 添加索引,就能根据二叉树等数据结构的特性、减少查询次数,找到对应索引所指向的物理地址,从而找到那一行。

4 mysql底层实现索引的数据结构是b+tree。

5 为啥不用二叉树作为索引的数据结构,因为在索引的字段是有序的时候,索引是不起优势的

6 提一句,jdk8 中hashmap底层链表改成用红黑树实现

7 红黑树一种自平衡的二叉树,可以在某些情况比二叉树查询有优势。但不够明显。在数据量大的情况下查找效率还是很低。

8 红黑树优化改进,在一个结点上存储多个元素,让每个索引都能存储很多元素,就能压低树的高度,极大的减少查询次数。

9 第八条的改进的树就叫B树,特点就是一个结点可以存储多个元素,且从左自右递增,各个元素不重复。

10 那为啥不能将所有元素都存在一个结点上,因为数据量大的时候,存在一个结点的话,查询时会将结点load到内存,就会造成内       存不足,并且load进内存的数据大小一次也不能太大。

11.Mysql中对结点大小的设置是16k。

12 B树查找的流程,先从跟结点出发,load到内存,快速比对结点中的有序序列,如果要查找的元素在两个元素之间,就根据两个元素之间的指针找到下一个结点,再依次遍历。

13 B+树就是将B树中每个索引对应的data放在叶子结点,并且叶子结点用一个双向指针链接起来。

14 因此B+树的叶子结点就是整个索引链。

15 为什么将data下移到叶子结点,因为这样结点就能存储更多的索引。

16 16K的结点大小,高度h为3的B+树,可以存放2000多万的索引,基本满足千万级数据库的需求。

17 Mysql两种存储引擎MyISAM(非聚集)和InnoDB(聚集),针对表的存储。

18 MyISAM存储表会在mysql的data文件中生成3个文件,.frm存储表的结构、.MYD存储表的数据、.MYI存储表的索引。

19 primary key 自带一个主键索引。

20 InnoDB只会生成两个文件,.frm存储表的结构、.ibd存取数据和索引,集合在一起的。

21 InnoDB必须有主键,且推荐用整型的自增主键,为什么?因为InnoDB的数据是和主键存储在一起的,必须按B+树的形式去构建一个主键,如果建表时不指明,则Mysql选择一个不重复数据的字段作为主键索引,如果没有不重复的字段,就会生成一个你看不见的列,用来作为表的主键索引。如果不用整型数据作为主键,则在索引比较的时会造成时间浪费。为什么推荐自增呢,主要是因为B+树中叶子结点从左自右有个双向指针链接两个叶子结点,有利于范围查找。

22 InnoDB的存储数据中,在B+树的叶子结点中直接存储剩余字段的值,而不是MyISAM中存储是MYD文件中数据的地址。

23 聚集索引即使InnoDB的主键索引,因为叶子结点包含了所有的数据。

24 hash索引比B+树查找快很多,但是不支持范围查找,而B+树叶子结点之间的双向指针和结点有序的特点,对范围查找很好的支持。

25 联合索引,将几个字段联合成一个索引,一般建议建立联合索引。

26 联合索引最左前缀原则是先比较第一个字段,在比较第二个字段,依次比较建立B+树索引,如果查询中没用到第一个字段,将会使联合查询失效。 

发布了65 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhangtao0417/article/details/104488838