mysql多维度搜索如何利用索引_mysql多列组合索引应用

张开发
2026/4/21 14:34:39 15 分钟阅读

分享文章

mysql多维度搜索如何利用索引_mysql多列组合索引应用
MySQL组合索引需遵循最左前缀原则高频高区分度字段置左范围查询后字段失效ORDER BY/GROUP BY需与索引顺序一致覆盖索引可避免回表IN操作宜放索引最右过多组合索引会加剧写入负担。WHERE 条件里多个字段索引到底怎么写才生效MySQL 不会自动把单列索引拼起来用哪怕你给 user_id 和 status 各建了一个索引WHERE user_id 123 AND status active 也大概率只走其中一个。真正起效的是「组合索引」但顺序很关键——最左前缀原则不是口号是硬约束。常见错误现象EXPLAIN 显示 typeALL 或 keyNULL明明写了两个条件却没走索引或者只对 status 做了 IN 查询结果全表扫。把高频过滤、高区分度字段放最左边比如 user_id 区分度远高于 status范围查询、BETWEEN、LIKE abc%后面的字段索引失效——INDEX(a,b,c) 中若 a 是等值、b 是范围则 c 不再参与索引查找如果经常查 status created_at但 created_at 总是范围条件那组合索引应为 (status, created_at)而不是反过来ORDER BY 和 GROUP BY 混在多条件查询里索引还能不能覆盖排序和分组不是“额外加的”它们会直接影响索引是否能被完整利用。MySQL 要么用索引排序Extra 字段出现 Using filesort 就说明失败要么被迫临时表排序IO 和 CPU 成倍涨。使用场景分页查「某类用户最近 10 条订单」SQL 类似 WHERE category A ORDER BY created_at DESC LIMIT 10。组合索引必须包含 ORDER BY 的字段且顺序一致升序/降序也要匹配MySQL 8.0 支持混合方向但 5.7 及之前要求全同向WHERE 等值字段 ORDER BY 字段要连成最左前缀比如 INDEX(category, created_at) 可覆盖上面例子但 INDEX(created_at, category) 就不行——category 不是最左无法定位范围如果 SELECT 还要取 order_no、amount 等字段考虑加覆盖索引在组合索引末尾加上这些字段避免回表IN 查询遇上组合索引为什么有时快有时慢IN 在组合索引里地位尴尬它对最左字段是“等值集合”但对后续字段MySQL 通常只展开第一个值做索引查找其余退化为扫描。这不是 bug是优化器权衡 IO 和 CPU 后的选择。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。

更多文章