05-Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?【Java面试总结】

Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?

索引下推是mysql5.6 提出的一个查询优化方案,主要的目的是减少数据或查询中不必要的读取和计算,它的原理是将查询条件尽可能的推送到索引层面进行过滤,减少从磁盘读取的数据量和后续的计算开销。

回表:当查询条件涉及非聚簇索引而非聚簇索引本身无法提供查询所需的完整数据时,数据库需要执行回表操作从聚簇索引中获取缺失的数据,这个过程叫做回表。

在InnoDB的引擎中,所有数据是存储在聚簇索引中的,索引键值和行指针的数据结构存储在非聚簇索引中,当我们基于非聚簇索引查询数据,如果返回的列不能满足需求,就需要从聚簇索引中再进行一次查找。

聚簇索引:聚簇索引定义了表的物理排序顺序,并决定了数据行在磁盘上的存储位置。数据行按照聚簇索引的排序顺序直接存储在磁盘上,聚簇索引本身就是表的数据存储结构。(数据存储、每张表聚簇索引有且只有一个,一般指主键索引,当无主键时可以是唯一索引,如两者均无则InnoDB存储引擎会自动生成一个隐藏的主键,并将其作为聚簇索引);

非聚簇索引:除了聚簇索引外的其他索引,旨在加快查询效率。在InnoDB中,一张表可以有多个非聚簇索引,非聚簇索引本身不存储数据,而是存储索引键值、和行指针。通过非聚簇索引查找数据时,需要先定位到索引,然后通过行指针找到实际的数据行。

索引覆盖:一个查询可以完全通过索引来满足,而无需访问表的实际数据行,即无需回表;

索引覆盖的条件:查询条件包含在索引中

案例:假设有一个名为"users"的表,包含以下列:id、name、age、email,并且创建了一个名为"idx_age_email"的索引,包含列(age, email)

索引覆盖的情况:age, email查询条件

SELECT age, email FROM users WHERE age > 25;

无法索引覆盖的情况:name字段不属于索引字段中,还需要回表查询一次,因此不满足索引覆盖

SELECT name, email FROM users WHERE age > 25;

你可能感兴趣的:(Java面试题,mysql,java,面试)