目录
索引的类型
b-tree
适用于全键值、键值范围、或键前缀查找
可使用b-btree索引的有效查询
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精确匹配某一列,并范围匹配另外一列
- 只访问索引的查询(索引覆盖)
b-tree索引的限制
- 非最左列开始
- 不能跳过索引中的列
- 如果有某个列的范围查询,则其右边的所有列都无法使用索引优化查询
hash索引
精确匹配索所有列的查询才有效。
hash索引的限制
- hash索引只包含hash值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过访问内存中的行速度很快,大部分情况下这一点对性能影响并不明显。
- hash索引数据并不是按照顺序存储,无法用于排序
- hash索引不支持部分索引列匹配查找。如在列(a,b)建立索引,查找时只用a列,则不能使用hash索引。
- 只支持
=、in、 <=>
操作 - 访问hash索引的数据非常快,除非有很多hash冲突,hash冲突,则遍历底层所有的行指针,逐行比较。直到找到符合所有条件的行。
- 如果hash冲突很多的话,索引维护操作的代价也会很高。
rtree空间数据索引
用作地理数据存储,MySQL的gis支持不完善,基本不会使用这个特性。支持好的开源库有PostgreSql,PostGIS
InnoDB
主键索引也叫聚簇索引(clstered index),叶节点数据为整列值.
非主键索引也叫二级索引(secondary index),叶节点是主键值
- 自适应哈希索引(
adaptive hash index
).innodeDb注意到某些索引值被使用的非常频繁时,会在内存中基于B-tree的索引之上再创建一个hash索引。这是一个完全自动的、内部的行文,用户无法控制,如果有必要,可以关闭其功能。
覆盖索引
只访问索引,而不需要访问数据
联合索引
最左原则,从mysql5.6之后,匹配最左m列 或者最左n个字符