如何实现网站的快速排名,wordpress建站全教程,网站开发 浏览器兼容性,网站策划建设方法Mysql夺命三连问#xff1a;什么是索引下推#xff1f;什么是索引覆盖#xff1f;什么是回表#xff1f;
索引下推是mysql5.6 提出的一个查询优化方案#xff0c;主要的目的是减少数据或查询中不必要的读取和计算#xff0c;它的原理是将查询条件尽可能的推送到索引层面…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;