细读MySQL实战45讲-深入浅出索引
常见类型
哈希表
添加数据,单个值查询都是Ologn时间复杂度
缺点:不是有序的,区间查找效率很低,只能遍历,适用于只有等值查询的场景,比如 Memcached 及其他一些NoSQL 引擎。
有序数组
缺点:只适用于静态存储引擎,因为一旦插入删除数据,有序数组就要往前或者后移位
二叉/多叉树
二叉树为了维持 O(log(N)) 的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(log(N))。
缺点:索引不止存在内存中,还要写到磁盘上,树越高查询时间越久,用多叉树可以有效降低树高
InnoDB 的索引模型 B+ 树
-
每一个索引在 InnoDB 里面对应一棵 B+ 树。
-
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
也就是说采用非主键进行查找时实际会有一个回表的过程,用得到的主键再次查询,因此查询时建议用主键
-
建议使用主键自增,由于 B+ 树是有序,通过最左前缀原则可以快速找到对应的数据,B+树不用调整数据顺序。
覆盖索引
由于key关联到主键,所以查询主键时不需要回表,这就是一种覆盖索引
select ID from T where k between 3 and 5
这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了
复合索引
-
遵循最左侧原则
从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a a,b a,b,c 3种组合进行查找,但不支持 b,c进行查找。当使用最左侧字段时,索引就十分有效。
-
遇到范围查找失效
-
索引下推
索引下推在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率,5.6之前是一个一个验证复合索引,遇到一个索引就回表一次,而索引下推直接验证所有索引符合条件才回表
原文地址:https://www.cnblogs.com/crisliu/p/14781898.html