创建高性能的索引1
索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能。
索引对于良好的性能非常重要。
索引优化应该是对查询性能优化最有效的手段了,索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能好两个数量级,创建一个真正“最优”的索引经常需要重写查询。
一、索引的类型
1.B树索引
当人们谈论索引的时候,如果没有特别指明类型,那么多半说的是B树索引,他使用B树数据结构存储数据。
可以使用B树索引的查询类型:全值匹配、匹配最左前缀、匹配列前缀、匹配范围值、精确匹配一列并范围匹配另一列、只访问索引的查询。
B数树索引的限制:如果不是按照索引的最左列开始查找,则无法使用索引、不能跳过索引中的列、如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询。
2.哈希索引
在MySql中,只有Memory引擎显示支持哈希索引。
哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
哈希索引只支持等值比较查询。
访问哈希索引的数据非常快,除非有很多哈希冲突。
如果哈希冲突很多的话,一些索引维护操作的代价也会很高。
InnoDB引擎有一个特殊的功能叫做“自适应哈希索引”,当InnoDB注意到某些索引值被使用的非常频繁时,他会在内存中基于B树索引之上再创建一个哈希索引。
如果存储引擎不支持哈希索引,可以模拟像InnoDB一样创建哈希索引,这可以享受一些哈希索引的便利,例如只需要很小的索引就可以为超长的键创建索引。
3.空间数据索引(R树)
MyISAM表支持空间索引,可以用作地理数据存储。
4.全文索引
全文索引是一种特殊类型的索引,他查找的是文本中的关键词,而不是比较索引中的值。在相同的列上同时创建全文索引和基于值的B树索引不会有冲突,全文索引适用于MATCH AGAINST 操作,而不是普通的WHERE条件操作。
5.其他索引类别
还有很多第三方的存储引擎使用不同类型的数据结构来存储索引,例如TokuDB使用分形树索引(fractal tree index)。
二、索引的优点
索引可以让服务器快速地定位到表的指定位置。但是这并不是索引的唯一作用。
1.索引大大减少了服务器需要扫描的数据量。
2.索引可以帮助服务器避免排序和临时表。
3.索引可以将随机I/O变为顺序I/O。