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