MySql学习系列 -- 索引基本概念了解

版权声明:本文为博主原创文章,未经博主允许不得转载。如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步! https://blog.csdn.net/ydm19891101/article/details/84944432

之前MySql架构文章中介绍了索引是在存储引擎层实现的,本篇将继续索引相关知识的了解,这里只是记录一些结论性的东西,并不会具体展开。

1、索引是在存储引擎层实现,用来快速找到记录的一种数据结构;不同存储引擎对索引的实现是不一样的,而且不同的存储引擎可能支持不同的索引,如InnoDB支持聚簇索引,MyISAM支持全文索引和空间索引;索引数据很多也是用的B+Tree 结构存储的。
2、索引是提高性能最直接有效的方式,好的索引较无索引的查询或者不好的索引可以提高几个数量级;没有索引的查询需要一行一行从上到下的全表扫描。
3、MySQL使用索引的方式是先在索引文件中找到对应的索引记录,然后根据拿到的索引记录再去数据文件中寻找对应的记录。
4、MyISAM使用前缀压缩技术使得索引更小,方便更多的索引数据载入内存;InnoDB则是按照原数据格式进行存储。
5、MyISAM索引通过数据的物理位置来引用被索引的行,InnoDB则使用主键索引来引用被索引的行。存储物理位置的话在数据移动或者分页的时候会造成索引的变更,对于更新频繁的应用来说,索引维护比较大。
6、B+ Tree对于数据是按顺序组织存储的,所以很适合查找范围数据;B+Tree索引适合于全键值、键值范围或者键前缀查找,键前缀是指的最左前缀匹配。
7、B+Tree是顺序组织的数据,可以在order by、group by 等排序场景下运用索引结构,避免文件排序和随机I/O。
8、如果查询中有某个列的范围查询,则右边的所有列都无法使用索引优化查找。
9、hash索引是根据列值计算它的hash值,索引结构中存储的也只是hash值和指向记录的指针;hash索引节点上存储的数据非常紧凑,查询效率比较高;但是不可以用于范围查找和排序操作,而且hash计算出来的数据值可能有冲突,需要通过链表解决;hash索引只支持等值比较查询,如= in <=>,基于此,hash索引只适用于特定的场合。
10、索引有以下优点:
   (1)大大较少了服务器需要扫描的数据量
   (2)可以避免服务器进行排序和使用临时表
   (3)可以将随机I/O变为顺序I/O
   (4)可以避免进行回表查询(使用覆盖索引 explain中的extra中表示为using index)
11、对于较长的varchar char text类型的字段,如果需要建立索引,可以只使用列的前一部分数据作为范围前缀,前缀长度的话要保证区分度和选择整个列的区分度很接近。这样可以最大限度的减少索引数据的长度,便于索引数据尽可能的载入内存中查询。但是会造成order by / group by 操作无法使用索引进行优化,同时不能应用覆盖索引。

12、由于覆盖索引需要存储索引列的值,目前MySql只能使用B-Tree索引做覆盖索引。

13、对于范围条件查询,MySql无法再使用范围列后面的其他索引列了;但是对于"多个等值条件查询"则没有这个限制。 所以,尽可能的将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列。

14、MySql不能在索引中执行like操作,这是低层存储引擎api的限制。5.5 - 版本中只允许在索引中做简单比较操作(等于 不等于 大于)。MySql可以在索引中做最左前缀匹配的like比较,因为该操作可以被转换为简单的比较操作,但是如果是通配符开头的like操作,存储引擎就无法做比较匹配,也就无法使用索引。

猜你喜欢

转载自blog.csdn.net/ydm19891101/article/details/84944432