12306网站如何做解绑,工程建设安全管理,一个完整的项目计划书,电商平台运营是做什么的概述
覆盖索引#xff08;Covering Index#xff09;是一个 MySQL 查询优化技术#xff0c;它指的是一个索引包含了查询所需的所有字段的数据#xff0c;因此不需要回表#xff08;访问数据表的行#xff09;就可以完成查询。使用覆盖索引可以显著提高查询性能#xff…概述
覆盖索引Covering Index是一个 MySQL 查询优化技术它指的是一个索引包含了查询所需的所有字段的数据因此不需要回表访问数据表的行就可以完成查询。使用覆盖索引可以显著提高查询性能因为它减少了磁盘 I/O 操作。 既然是索引除了存储索引字段的数据之外还存储了主键信息。 覆盖索引的使用条件 为查询的字段都在索引中查询涉及的所有字段SELECT 列表、WHERE 子句和 ORDER BY 子句中的字段必须包含在索引中。
覆盖索引使用示例
假设有一个表 users结构如下
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT,INDEX idx_name_age (name, age)
);SELECT name, age,id FROM users WHERE name John;在这个查询中idx_name_email_age 索引可以作为覆盖索引因为
查询的字段 name 和 email 都包含在索引中。WHERE 子句中的字段 name 也是索引的一部分。
因此MySQL 可以仅通过访问 idx_name_email_age 索引来完成查询而不需要访问 users 表的实际行数据。
问题使用不等于/一定不走索引吗
在索引时效的场景之一就是 where 条件中使用了不等于符号导致索引时效。 比如
explain select * from users where name ! xjjf;通过执行计划我们可以看到type 为 ALL并没有走索引。
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEusersALLidx_name_age1100Using where
但如果我们通过索引覆盖进行优化后效果就不太一样了通过执行计划我们可以看到走了索引。
explain select id,name,age from users where name ! xjjf;idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEusersALLidx_name_age1100Using where
执行计划是以最低的成本来选择 sql 执行方式的但查询的字段中包含非索引字段意味着还需要进行一次回表这样的成本可能还不如全表扫描性能更优因此就不会走索引了遇到 sql 性能问题还是需要具体问题具体分析。
覆盖索引和联合索引有什么区别
看了使用覆盖索引进行查询优化后可能会疑惑这不就是联合索引吗其实不然。 联合索引主要用于加速多列查询而覆盖索引的目的是避免访问表数据(回表)。 联合索引用于在单个索引中包含多个列以提高查询效率。它是一个物理索引存储在数据库中覆盖索引是一个查询优化技术指的是查询所需的所有数据都能从索引中获取而无需访问表数据。 覆盖索引是一种查询优化技术而联合索引是一种索引结构。 联合索引可以实现覆盖索引但覆盖索引不一定是联合索引(覆盖索引可以是单列索引)。
结语
以上祝你今天愉快