索引类型
树状数据结构的演变:
// todo 这里跳转
B-Tree
这里的B-tree是没有具体到存储引擎的变种结构和算法。比如innodb的B+Tree。
这里会单独写B+Tree:
// todo 这里跳转B+Tree
每个存储引擎具体实现的B-Tree和采用的算法都可能是不一样的,这里主要说MyISAM和InnoDB
区别 | InnoDB | MyISAM |
---|---|---|
存储方式 | 索引按照原数据存储 | 索引进行了压缩存储 |
引用方式 | 根据主键引用被索引的行 | 索引根据磁盘物理位置引用被索引的行 |
B-Tree的叶子节点是连续的,所以是支持范围查找的
索引匹配
- 全值匹配:和索引中所有的列都进行匹配
- 最左前缀匹配:只使用索引的第一列
- 列前缀匹配:只匹配列的开头部分
- 范围值匹配:匹配某一列范围间的数据
- 只访问索引:只需要返回索引的值,也就是(索引覆盖)
索引限制
- 如果不是从最左列开始,就无法走索引
- 不能跳过索引中间的列
- 如果出现了范围查询,那么范围查询右边的索引就都不起效了
Hash(哈希索引)
每一行数据,存储引擎都会对所有的索引计算哈希码,因为计算出来是一个较小的值,所以以它为索引储存查询效率会快很多(前提是出现的哈希冲突比较少),然后在存入相应的数据行指针。
哈希索引的缺陷:
- 因为计算的hashCode无法根据顺序排列,所以不支持范围查找
- 因为始终是用所有索引列进行哈希计算,所以无法单独使用部分索引列进行查找
- 可能会存在哈希冲突
- 如果哈希冲突多的话,索引维护操作代价会很大
Innodb有一个自适应的哈希索引。在B-Tree的基础上再创建hash索引,可以快速的通过hash进行数据查找,这是个完全由引擎内部操作,外部无法改变的和配置的功能,但是可以关闭该功能。
R-Tree
MyISAM支持空间索引,无需遵循前缀索引的规则,可以使用任意的维度组合查询,但是必须使用MySQL的GIS相关函数进行维护。
可以用作地理数据储存
全文索引
查询的是文本中的关键词,更类似于搜索引擎的运作,而不是跟之前的索引一样直接用一个列的数据,在同一列上,可以同时创建B-Tree索引和全文索引,全文索引适用于MATCH AGAINST操作,而不是普通的WHERE操作