每日八股文6.4
每日八股-6.4
- Mysql
- 1.什么是覆盖索引?在什么情况下会用到?
- 2.回表了解吗?在什么情况下会发生回表查询呢?
- 3.建立索引要注意什么呢?
- 4.能给我解释一下什么是 MySQL 的最左匹配原则吗?
Mysql
1.什么是覆盖索引?在什么情况下会用到?
覆盖索引是指在一个查询中,我们需要查询的字段(包括 SELECT 列表中的列、WHERE 子句中的条件列等)都可以在所使用的二级索引的叶子节点中找到,而不需要再回到聚簇索引中去查找完整的行记录。
简单来说,就是我们要查询的数据,索引已经“覆盖”了,不需要再进行回表操作。
使用覆盖索引的主要目的是为了提高查询效率,因为避免了回表操作,减少了一次磁盘 I/O。只需要扫描一次索引 B+ 树就可以获取到所有需要的数据。
2.回表了解吗?在什么情况下会发生回表查询呢?
当我们在使用二级索引(非聚簇索引)进行查询的时候,如果我们要查询的数据列,并不能在二级索引的叶子节点中全部找到,那么就会发生回表查询。
具体来说,二级索引的 B+ 树的叶子节点存储的是索引列的值以及对应数据行的主键 ID。如果我们通过二级索引查询的字段除了索引列本身和主键 ID 之外,还包含了其他的列,那么在二级索引中找到对应的主键 ID 后,还需要再通过这个主键 ID 到聚簇索引(主键索引)中去查找完整的行记录,才能获取到我们需要的全部数据。这个通过二级索引找到主键 ID,然后再回到聚簇索引中查找数据的过程就叫做“回表”。
回表查询会增加额外的 I/O 开销,因此在设计索引和编写 SQL 查询时,我们应该尽量避免不必要的回表,例如可以通过使用覆盖索引来减少回表的发生。
3.建立索引要注意什么呢?
首先,经常出现在 WHERE 子句中的字段是建立索引的首要考虑对象。因为索引的主要目的是为了加快数据检索的速度,如果一个字段经常被用来作为查询条件,那么在该字段上建立索引可以显著提高查询效率。如果查询条件涉及到多个字段,可以考虑建立联合索引。
其次,用于 ORDER BY 和 GROUP BY 子句的字段也适合建立索引。如果查询结果需要排序或者分组,并且排序或分组的字段上存在索引,MySQL 可以直接利用索引的有序性,避免额外的排序操作,提高查询性能。
第三,具有唯一性限制的字段非常适合建立索引,比如商品编码、订单号等。唯一索引不仅可以提高查询速度,还可以保证数据的唯一性。即使不是强制唯一,区分度高(即字段中不同值的比例较高)的字段也适合建立索引,因为区分度越高,索引的选择性就越好,查询效率也越高。
然而,也存在一些不适合建立索引的情况:
- 在 WHERE、GROUP BY 或 ORDER BY 子句中很少使用的字段,建立索引不会带来明显的性能提升,反而会增加存储空间和维护成本。
- 字段中存在大量重复数据,区分度很低的字段,比如性别字段,只有男女两种值。在这种情况下,索引的选择性很差,MySQL 优化器可能会选择全表扫描而不是使用索引。
- 频繁更新的字段不适合建立过多的索引。因为每次更新操作,不仅需要更新表中的数据,还需要更新相关的索引,索引越多,维护成本就越高,可能会降低更新操作的性能。
4.能给我解释一下什么是 MySQL 的最左匹配原则吗?
MySQL 的最左匹配原则是针对联合索引来说的。当我们创建一个包含多个列的联合索引时,例如 (a, b, c),MySQL 在构建这个索引时,会先按照最左边的列 a 进行排序,然后在 a 值相同的情况下再按照列 b 进行排序,最后在 b 值也相同的情况下再按照列 c 进行排序。
因此,在使用这个联合索引进行查询时,查询条件必须从索引的最左侧开始匹配。具体来说有以下几个规则:
- 查询条件中必须包含联合索引最左边的列(或者最左边的几个列),这样才能利用到这个联合索引。例如,对于索引 (a, b, c),我们可以使用 WHERE a = 1,WHERE a = 1 AND b = 2,或者 WHERE a = 1 AND b = 2 AND c = 3 这样的查询条件来利用索引。
- 如果查询条件中没有使用到联合索引最左边的列 a,那么即使查询条件中包含了 b 或 c,这个联合索引也是无法被使用的。例如,WHERE b = 2 或者 WHERE c = 3 都不会使用到 (a, b, c) 这个索引。
- 如果查询条件中跳过了联合索引中间的列,那么只有跳过之前的列可以使用到索引,跳过之后的列无法使用索引。例如,对于索引 (a, b, c),如果查询条件是 WHERE a = 1 AND c = 3,那么只有列 a 能使用到索引,列 c 是无法使用索引的。
- 当查询条件中使用了范围查询时,例如 WHERE a > 1 AND b = 2 AND c = 3,那么只有范围查询的列 a 可以使用到索引,而其后面的列 b 和 c 通常无法再使用到索引进行精确匹配。