mysql索引与覆盖查询的深度实践_mysql性能压测与优化
pSELECT * 让覆盖索引失效因其强制回表查询聚簇索引覆盖索引要求查询字段全部且严格按最左前缀顺序包含在单个索引中且不含TEXT/BLOB。/p为什么 SELECT * 让覆盖索引失效覆盖索引生效的前提是查询所需的所有字段全部被单个索引“包住”。一旦用了 SELECT *InnoDB 就不得不回表查聚簇索引——哪怕你只差一个字段没在索引里。常见错误现象EXPLAIN 显示 typeref 但 Extra 列出现 Using where; Using index说明走了覆盖而加了 * 后变成 Using where没了 Using index性能掉一截。实操建议用 SELECT 明确列出需要的字段且确保它们全在同一个复合索引中按顺序存在注意字段顺序索引定义是 (a, b, c)那 SELECT a, b 可覆盖但 SELECT b, c 不行缺失前导列 aTEXT/BLOB 类型字段无法被任何索引“覆盖”哪怕你把它加进索引定义MySQL 也会忽略——别试ORDER BY 和覆盖索引冲突时怎么破覆盖索引能避免排序Using filesort但前提是 ORDER BY 字段顺序与索引最左前缀严格一致且没有混合 ASC/DESC。使用场景分页查最新 20 条订单按 created_at DESC 排序但业务只要 id 和 status。错误写法INDEX (status, created_at) ORDER BY created_at DESC → 仍触发 Using filesort正确写法建索引 INDEX (status, created_at DESC)MySQL 8.0 支持显式方向声明MySQL 5.7 及更早只能靠 INDEX (status, created_at) ORDER BY status, created_at DESC 组合否则必回表或排序如果 WHERE 条件用了 IN 或范围如 created_at 2024-01-01ORDER BY 很可能失效——此时覆盖索引也救不了排序压测时发现 key_len 比预期小是不是索引没用上key_len 是 MySQL 实际用到的索引字节数不是定义长度。它变小往往意味着只用了索引前缀或字段为 NULL 导致额外字节开销。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器