B-Tree索引


  • 一般没有特殊说明都是默认B-Tree索引,他使用B-Tree数据结构存储数据
  • B-Tree索引可以加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点进行搜索

可以使用B-Tree索引的查询类型


  • 全值匹配
  • 匹配最左前缀
  • 匹配列前缀
  • 匹配范围值
  • 精确匹配某一列并范围匹配另外一列
  • 只访问索引的查询

限制


  • 如果不是按照索引的最左列开始查找,则无法使用索引
  • 不能跳过索引中的列。也就是如果有多个列作为索引,只查询一个列,是不会用到这个索引的。
  • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。

这些限制都是跟B-Tree索引结构的顺序性决定的,也就意味着,​不同查询条件需要不同顺序的B-Tree索引​。

哈希索引


  • 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。
  • 在mysql中,只有Memory引擎显式支持哈希索引,也是Memory引擎的默认索引类型。

限制


  • 不能使用索引中的值来避免读取行
  • 哈希索引数据并不是按照索引值顺序存储的,所以无法用于排序
  • 哈希索引和B-Tree索引一样,也不能支持部分索引列匹配查找
  • 只支持等值比较,不支持范围查询
  • 哈希值一样引起冲突的话,索引代价会很高

空间数据索引(R-Tree)


  • MyISAM表支持空间索引,可以存储地理数据。
  • 必须使用GIS相关函数维护
  • MySQL中并不常用

全文索引


  • 用于查找文本中的关键词,而不是直接比较索引中的值
  • 在相同的列中同时创建全文索引和B-Tree索引并不冲突

索引的优点


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