ToB企服应用市场:ToB评测及商务社交产业平台

标题: Mysql 性能优化:覆盖索引 [打印本页]

作者: 张国伟    时间: 2025-1-13 06:05
标题: Mysql 性能优化:覆盖索引
概述

覆盖索引(Covering Index)是一个 MySQL 查询优化技术,它指的是一个索引包含了查询所需的全部字段的数据,因此不需要回表(访问数据表的行)就可以完成查询。利用覆盖索引可以显着提高查询性能,因为它减少了磁盘 I/O 操作。
   既然是索引,除了存储索引字段的数据之外,还存储了主键信息。
  覆盖索引的利用条件 为查询的字段都在索引中:查询涉及的全部字段(SELECT 列表、WHERE 子句和 ORDER BY 子句中的字段)必须包含在索引中。
覆盖索引利用示例

假设有一个表 users,结构如下:
  1. CREATE TABLE users (
  2.     id INT PRIMARY KEY,
  3.     name VARCHAR(100),
  4.     email VARCHAR(100),
  5.     age INT,
  6.     INDEX idx_name_age (name, age)
  7. );
复制代码
  1. SELECT name, age,id FROM users WHERE name = 'John';
复制代码
在这个查询中,idx_name_email_age 索引可以作为覆盖索引,因为:

因此,MySQL 可以仅通过访问 idx_name_email_age 索引来完成查询,而不需要访问 users 表的实际行数据。
问题:利用不等于/<>一定不走索引吗

在索引时效的场景之一,就是 where 条件中利用了不等于符号,导致索引时效。
好比:
  1. explain select * from users where name != 'xjjf';
复制代码
通过实验计划我们可以看到,type 为 ALL,并没有走索引。
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEusersALLidx_name_age1100Using where 但如果我们通过索引覆盖举行优化后,结果就不太一样了,通过实验计划我们可以看到,走了索引。
  1. explain select id,name,age from users where name != 'xjjf';
复制代码
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEusersALLidx_name_age1100Using where 实验计划是以最低的本钱来选择 sql 实验方式的,但查询的字段中包含非索引字段,意味着还需要举行一次回表,这样的本钱可能还不如全表扫描性能更优,因此就不会走索引了,遇到 sql 性能问题,还是需要具体问题具体分析。
覆盖索引和联合索引有什么区别

看了利用覆盖索引举行查询优化后,可能会疑惑这不就是联合索引吗?其实否则。

结语

以上,祝你今天舒畅!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4