mysql索引区分度不足如何解决_mysql多列索引组合优化

WHERE a = ? AND b = ? 用不上 (a, b) 索引是因为未满足最左前缀匹配原则:必须从索引最左列开始连续使用,且首列需为确定等值条件;若跳过a直接查b,或a为范围/函数/NULL,则索引失效。为什么 WHERE a = ? AND b = ? 用不上 (a, b) 索引?不是索引建错了,是查询条件没触发最左前缀匹配。MySQL 多列索引生效前提是:从左到右连续使用索引列,中间不能跳过。比如索引是 (status, created_at, user_id),但查询只写了 WHERE user_id = 123,那整个索引就失效。常见错误现象:EXPLAIN 显示 type: ALL 或 key: NULL,哪怕字段上明明建了索引。必须保证 WHERE 条件中,最左边的列(如 status)有确定值(非 IS NULL、非范围、非函数包裹),后续列才能被索引下推范围查询(>、BETWEEN、LIKE 'abc%')会截断索引,WHERE status = 'active' AND created_at > '2024-01-01' AND user_id = 123 实际只用到前两列OR 条件大概率让整条索引失效,别指望优化器能聪明地拆解区分度低的字段(如 gender、is_deleted)该不该放索引最左?不该------除非它能显著过滤数据。区分度(cardinality)低于 5% 的字段,单独建索引几乎没意义;放在联合索引最左,反而拖慢所有依赖该索引的等值查询。使用场景:你有一张订单表,order_status 只有 4 个值(pending / paid / shipped / cancelled),但 user_id 有百万级唯一值。此时 (order_status, user_id) 不如 (user_id, order_status)。用 SHOW INDEX FROM table_name 查看 Cardinality 列,对比字段实际唯一值数量执行 SELECT COUNT(DISTINCT col) / COUNT(*) FROM table_name,结果低于 0.03 就算低区分度如果必须查低区分度字段,优先考虑加在索引右侧,作为"筛选后排序/分组"的辅助列如何验证新索引是否真被用了?别只信 EXPLAINEXPLAIN 显示 key 非空,不代表查询真的快------可能走了索引但回表太多,或者扫描了大量无效索引页。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

相关推荐
子豪-中国机器人5 分钟前
第一部分:初赛选择题(30 题,对应线上每日问答)
python
Sam09276 分钟前
【AI 算法精讲 15】余弦相似度:向量检索与归一化内积
人工智能·python·算法·ai
ALex_zry7 分钟前
C++26 Freestanding 库扩展详解:无操作系统也能用标准库
java·jvm·c++
倔强的石头_15 分钟前
【Kingbase应用接入与连接池治理】JDBC驱动与连接串实战
数据库
Starry-sky(jing)29 分钟前
RecursionError: maximum recursion depth exceeded —— 你的函数调用链,踩穿了 CPython 的安全气囊
python·cpython·pydantic·recursionerror·递归深度·递归限制·sys.setrecursionlimit
cui_ruicheng33 分钟前
Python从入门到实战(三):流程控制与循环语句
开发语言·python
Omics Pro39 分钟前
Agentic AI正在重构整个生物信息学工作流
大数据·数据库·人工智能·机器学习·语言模型·自然语言处理·重构
Rauser Mack43 分钟前
Vibe coding游戏实战:零代码编程五子棋小游戏
人工智能·python·游戏·html·prompt
FriendshipT1 小时前
Ultralytics:解读PSABlock模块
人工智能·pytorch·python·深度学习·目标检测
hhzz1 小时前
全局实例跟踪(GIT):像人类一样定位目标——VideoCube基准与SiamFC实战全解析
大数据·python·计算机视觉·目标跟踪·数据分析