1、索引数据结构:
-
Hash结构:底层是哈希表,哈希表是一种key-value存储数据,多个数据在存储关系上完全没有顺序关系。对于区间查询是无法通过索引查询,就需要全表扫描。所以哈希索引只适用等值查询场景。
-
B+ Tree结构
Hash结构局限性:
-
Hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询,无法被用来避免数据的排序操作。
因为经过相应的Hash算法处理之后的Hash值的大小关系,并不能保证和Hash运算前完全一样; -
Hash索引不能利用部分索引键查询。
对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值,而不是单独计算Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用;
-
Hash索引在任何时候都不能避免全表扫描。
由于不同索引键存在相同Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要回表查询数据.
-
Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B+树索引高。
B+ Tree索引和Hash索引区别?
-
1、哈希索引适合等值查询,但是无法进行范围查询 。
2、哈希索引没办法利用索引完成排序 。
3、哈希索引不支持多列联合索引的最左匹配规则 。
4、如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
2、索引种类:
-
聚簇索引:在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引。
-
非聚簇索引:而索引B+ Tree的叶子节点存储了主键的值的是非主键索引。
-
覆盖索引:减少回表次数,降低IO。
聚簇与非聚簇索引区别?
-
主键索引树的叶子节点直接就是我们要查询的整行数据。
-
非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次回表查询。
非主键索引检索过程不全都是上面的描述:
覆盖索引:一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
eg:
covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。
当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表。
组合索引
-
MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候。
eg:如(key1,key2,key3),等价于创建了:
- (key1)
- (key1,key2)
- (key1,key2,key3)三个索引,这就是最左匹配原则。
网友评论