为什么加索引可以提高查询速度(为什么添加索引后查询速度会快)
为什么加索引可以提高查询速度(为什么添加索引后查询速度会快)节点页中存放的值和下级节点叶的指针所有值都是顺序存储,每个叶子节点到根的距离相同1、B-TREE索引索引的存储结构:B-TREE树形结构,所有叶子节点到根节点的深度相同
索引 性能利剑
一、索引是什么,为什么添加索引后查询速度会快?
mysql中索引是存储引擎层面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是表中数据量很大的时候,正确的索引会极大的提成查询效率。简单理解索引,就相当于一本砖头厚书的目录部分,通过目录可以快速查找到想要找的内容具体所在的页码。
二、索引有哪些种类
1、B-TREE索引
索引的存储结构:B-TREE
-
树形结构,所有叶子节点到根节点的深度相同
-
所有值都是顺序存储,每个叶子节点到根的距离相同
-
节点页中存放的值和下级节点叶的指针
-
叶子节点中的指针存放的是被索引的数据(索引列数据项值)
-
根据条件查询B-TREE时,不需要全表扫描,只需要通过比较节点的值和要查找的值就可以逐级快速定位符合要求的叶子节点
-
B-TREE因为是顺序存储,所以特别适合范围数据的查询
B-TREE索引应用范围 索引包含多列时,索引对于多个值得排序依据是create table 时索引的列的顺序,既:key(column1 column2 column3),排序就是按照column1-> column2 -> column3 的顺序,存储也是按照此顺序,应用于如下类型查询更有效:
-
全值匹配
-
索引的全部列值匹配
-
匹配最左前缀
-
只使用索引的第一列
-
匹配列前缀
-
只匹配索引第一列的字符前缀
-
匹配范围值
-
值匹配第一列的值范围
-
精确匹配某一列,并全职匹配另外一列
-
索引第一列全值匹配,第二列前缀匹配
B-TREE索引使用限制
-
必须从最左列开始查找,否则索引无法使用
-
不能跳过索引列查找,例如索引列column1、column2、column3,就不能直接用column1、column3来查找,这么用mysql只能使用column1索引第一列。
-
如果索引列中某个列的范围查询,那么其右边所有列都无法使用索引优化查询。
注:索引列的顺序直接影响着查询是否能够应用索引,在各种条件查询的情况下,一种索引未必能够满足要求,所以往往就需要多组相同列顺序不同的索引来优化性能。
2、HASH索引
基于HASH表结构(Key-Value)实现,只有精确匹配索引全部列的查询才有效,每一行数据,存储引擎都会对所有索引列计算出一个hash code,作为key值存放在hash表中,value存放指向每个数据行的指针。