Mysql 索引


索引

索引优点:

  • 减少服务器需要扫描的数据量
  • 帮助服务器避免排序和临时表
  • 将随机的IO变成顺序的IO

索引的类型:

  • B树索引(B+树)

  • Hash索引

  • 空间索引(R-Tree)

  • 全文索引

B树索引

B树对索引列的顺序组织存储的,因此适合查找范围数据。适用于全键值,键值范围和键前缀查找。键前缀查找只适用于最左前缀的查找。

B树索引的限制

  1. 如果不是按照索引的最左列开始查找,则无法使用索引
  2. 不能跳过索引中的列
  3. 如果查询中有某个列的方位查询,则其右边所有列都无法使用索引优化查询

Hash索引

在MySQL中,只有支持Memory的引擎显示支持哈希索引。

Hash索引的限制

  1. Hash索引只包含哈希值和行指针,不存储字段值。因此不能用索引中的值来避免读取行
  2. 不能使用Hash索引进行排序,因为其存储的时候就不是按照行顺序进行存储
  3. Hash索引不支持部分索引值顺序存储。
  4. Hash索引只支持等值比较的查询
  5. 如果存在很多Hash collisions(冲突),会导致速度访问速度变慢。同事维护操作代价会很高

InnoDB会创建自适应哈希索引,当某个索引值使用频繁时,就会在B树索引上建立一个Hash索引。

切记不要使用SHA1 和MD5 作为Hash函数。这两函数计算出来的Hash值比较长,会浪费大量空间,降低比较速度。不过因为这两函数在设计上可以最大程度上消除冲突。当CRC32(循环冗余)出现大量冲突的时候,可以自定义Hash函数。

如何处理Hash冲突?当使用Hash索引进行查询的时候,必须在where子句中包含常量值

空间索引

MyISAM支持空间索引。空间索引常用于地理数据存储。这类索引会从所有维度来索引数据。查询时能够有效地使用任意维度来组合查询。

全文索引

全文索引类似于搜索引擎。不是简单的where条件匹配

额外扩展

《Relational Database index Design and the Optimizers》


文章作者: 彭峰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭峰 !
  目录