MySQL索引知识节点
- 索引: 索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。
- 索引的数据结构: 常见的MySQL主要有两种数据结构,Hash索引和B+树索引,我们使用的InnoDB引擎,默认的是B+树。
- Hash和B+树索引区别,优缺点,使用场景
Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的。对于区间查询是无法直接通过索引查询的,这就需要全表扫描。所以哈希索引只适用于等值查询的场景。比如= IN !=这样的等值索引。
而B+树是一种多路平衡查询树,所以它的节点是天然有序的(左子节点小于父节点,父节点小于右子节点)。所以对于范围查询的时候不需要做全表扫描。
B+树和Hash索引区别: 哈希索引适合等值查询,但是无法进行范围查询,哈希索引无法利用索引完成排序,哈希索引不支持多列联合索引的最左匹配规则,如果有大量重复键值值的情况下,哈希索引的效率会很低。因为存在哈希碰撞问题。 - B+树的叶子结点都可以存那些东西
InnoDB的B+树可以存储整行数据,也可以存储主键的值。
在InnoDB里,索引B+树的叶子结点存储了整行数据的是主键索引,也被称之为聚簇索引,而索引B+树节点存储了主键的值是非主键索引,也被称之为非聚簇索引。
聚簇索引查询会更快,因为主键索引树的叶子结点直接就是我们要查询的整行数据,而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询,这个过程叫回表,如果查询条件简单的话,只需要回表一次,如果复杂的话,需要多次回表查询。这里可以通过覆盖索引解决。
覆盖索引: 指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取,也可以称之为索引覆盖。
表sample中有个普通索引idx_k1_k2(k1,k2)
select k2 from sample where k1 = 'key’的时候就可以通过覆盖索引查询,无需回表。