
一个主键 id 和一个联合二级索引 profession、age、status。当执行查询时:
SELECT id, profession, age, status FROM tb_user WHERE profession = '软件工程' AND age = 31 AND status = '0';数据库优化器会检查所有可用的索引,以确定是否有任何索引可以用于覆盖这个查询。在这个情况下,如果二级索引包含 profession、age、status,并且数据库的存储引擎(如InnoDB)在二级索引的叶子节点中也存储了主键 id,那么这个二级索引就可以作为覆盖索引。
为什么系统会自动识别到它们四个加起来是覆盖索引?
这是因为数据库的查询优化器在执行查询之前会进行索引扫描和访问路径的选择。如果发现有索引包含所有需要检索的列(在这个例子中是 id、profession、age、status),那么优化器会选择使用这个索引来执行查询,而不需要进行回表查询。
这个覆盖索引是从哪里来的?
**覆盖索引并不是由用户显式声明的,而是由数据库系统根据已有的索引和数据存储方式自动识别的。**在InnoDB中,二级索引的叶子节点默认包含主键的值,所以如果二级索引的键值包括了 profession、age、status,并且 id 作为主键被存储在二级索引的叶子节点中,那么这个二级索引就可以作为覆盖索引使用。
为什么系统会提示使用了覆盖索引?
当执行 EXPLAIN 或其他类似命令来分析查询时,如果查询优化器决定使用覆盖索引,你会在分析结果中看到提示,如 Using index。这是系统告诉你它已经找到一个索引,它包含了查询所需的所有数据,因此不需要访问表的行数据。