索引
索引优点:
- 减少服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 将随机的IO变成顺序的IO
索引的类型:
B树索引(B+树)
Hash索引
空间索引(R-Tree)
全文索引
B树索引
B树对索引列的顺序组织存储的,因此适合查找范围数据。适用于全键值,键值范围和键前缀查找。键前缀查找只适用于最左前缀的查找。
B树索引的限制
- 如果不是按照索引的最左列开始查找,则无法使用索引
- 不能跳过索引中的列
- 如果查询中有某个列的方位查询,则其右边所有列都无法使用索引优化查询
Hash索引
在MySQL中,只有支持Memory的引擎显示支持哈希索引。
Hash索引的限制
- Hash索引只包含哈希值和行指针,不存储字段值。因此不能用索引中的值来避免读取行
- 不能使用Hash索引进行排序,因为其存储的时候就不是按照行顺序进行存储
- Hash索引不支持部分索引值顺序存储。
- Hash索引只支持等值比较的查询
- 如果存在很多Hash collisions(冲突),会导致速度访问速度变慢。同事维护操作代价会很高
InnoDB会创建自适应哈希索引,当某个索引值使用频繁时,就会在B树索引上建立一个Hash索引。
切记不要使用SHA1 和MD5 作为Hash函数。这两函数计算出来的Hash值比较长,会浪费大量空间,降低比较速度。不过因为这两函数在设计上可以最大程度上消除冲突。当CRC32(循环冗余)出现大量冲突的时候,可以自定义Hash函数。
如何处理Hash冲突?当使用Hash索引进行查询的时候,必须在where子句中包含常量值
空间索引
MyISAM支持空间索引。空间索引常用于地理数据存储。这类索引会从所有维度来索引数据。查询时能够有效地使用任意维度来组合查询。
全文索引
全文索引类似于搜索引擎。不是简单的where条件匹配
额外扩展
《Relational Database index Design and the Optimizers》