MySQL优化01-索引

本人理解,如若有误,欢迎指出。

索引

索引是帮助MySQL高效获取数据的排好序的数据结构。对于平时SQL语句的优化我这从索引开始,别的影响查询效率的比如,字段大小,合理的字段类型等,这里不做讨论。

索引类型

提示:这个网址,可以在线演示索引的插入情况:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二叉树

MySQL优化01-索引_第1张图片

从图中可以看到,二叉树的机构,数的叶子节点左边的小于右边,如果我们插入的数据是递增的,那么这棵树就会一直往右增加,整棵树的高度就会不断的升高

红黑树

MySQL优化01-索引_第2张图片

从图中可以看到,红黑树保持了和二叉树的特点,叶子节点左边小于右边,但是它多了一个平衡,从而让数的高度不至于升高。
提示:比较二叉树和红黑树查找节点5的数据,我们发现,二叉树需要查询5次,红黑树3次,查询速度就快了很多

Hash表

MySQL优化01-索引_第3张图片

很多时候 Hash 索引要比 B+ 树索引更高效;
仅能满足“=”,“IN”,不支持范围查询;
hash冲突问题;
从图看出,只需要hash一次就可以快速定位数据的位置。但是存在hash冲突,导致hash链长。但是总体上说hash结构的索引查询效率还是很高的。

B-Tree

MySQL优化01-索引_第4张图片

叶节点具有相同的深度,叶节点的指针为空;
所有索引元素不重复;
节点中的数据索引从左到右递增排列;
提示:对比二叉树,B-Tree也是一种特殊的二叉树。数据存储在索引上,同时由于相同高度存放的索引元素更多,查询效率更高

B+Tree(B-Tree变种)

MySQL优化01-索引_第5张图片

非叶子节点不存储 data ,只存储索引 ( 冗余 ) ,可以放更多的索引 ;
叶子节点包含所有索引字段;
叶子节点存在指针指向

MySQL索引

MySQL使用的是B+Tree索引。使用B+Tree索引的好处就是可以存储更多的索引 ,让数的高度下降,通时叶子几点存在指针指向,让查询效率更快。

我们知道MySQL最常用的存储引擎就是Innodb和MyISAM,他们存数数据的时候底层是怎么存储的呢?

MyISAM引擎

MySQL优化01-索引_第6张图片

MyISAM索引文件和数据文件是分离的(非聚集),从图中可以看出使用的B+Tree的索引存储方式,叶子节点存放的是主键索引,查找数据的时候根据找到的主键,在回表一次查询得到最终的数据

Innodb引擎

MySQL优化01-索引_第7张图片

遍历主键索引的叶子节点最后就是得到我们需要的数据,所以Innodb的主键索引是聚集索引。 聚集索引叶节点包含了完整的数据记录

联合索引

MySQL优化01-索引_第8张图片

则是一个使用多个字段联合的索引底层数据存储结构,是联合主键索引,叶子节点包含了所有的表数据。

了解了这些索引的数据结构后可以回答如下问题:

为什么建议 InnoDB 表必须建主键,并且推荐使用整型的自增主键

因为索引是有序的一种数据结构,使用整形,递增,这要在维护索引的时候就更好维护,我们在创建标的时候即使不创建主键,MySQL也会给我们生成主键,只是我们看不到是隐藏的,在创建表时候我们自己定义主键比MySQL自己维护主键效率会更高。

为什么非主键索引结构叶子节点存储的是主键值

MySQL优化01-索引_第9张图片

一致性和节省存储空间,回表查询

你可能感兴趣的:(mysql,mysql,数据库)