Mysql有不同的存储引擎类型,存储引擎使用不同的方式将索引存放在磁盘上。不同的存放方式对性能有不同的影响。MyIsam按照行存储的物理位置来寻找数据,Innodb按照主键值引用行。
Mysql 索引的类型
B-Tree索引
B-Tree索引的适用场景
匹配全名,匹配最左前缀,匹配列前缀,精确匹配一部分,并且匹配某个范围值的一部分,只访问索引的查询。
Hash索引
Hash索引建立在Hahs表的基础上,仅对每一列的精确查找有用。对于每一行,存储引擎计算出一个Hash Code,他是一个较小的值,并且可能和其他行的Hash码不同,Hash码保存在索引中,并且保存了一个指向Hash表中每一行的指针。
Hash索引的限制
Hash索引只包含了Hash码和行指针,也就意味着不能直接从索引获得数据;不能使用Hash索引进行排序;Hash索引不支持部分键值匹配;Hash索引只支持了=,in(),<=>等运算符。访问Hash索引中的数据非常快,除非碰撞率很高,当发生碰撞时,存储引擎必须访问链表中的每一行指针,逐行进行比较,确认正确的数据;如果有很多碰撞,一些索引维护操作就会变慢。
自适应Hash索引
当Innodb的一些索引值被频繁访问时,它就在B-Tree的顶端建立为这些值建立内存中的索引。这个过程是自动执行的,没办法配置。
空间索引
全文索引
前缀索引
使用前缀索引的好处是节约空间并提高性能,但,使用这类索引时,需要关注索引的选择性,当选择的前缀长度的选择性和整列的选择性接近时,选择的长度才较好。