0

0

mysql如何处理联合索引的数据倾斜_mysql索引组合优化

P粉602998670

P粉602998670

发布时间:2026-03-17 14:47:03

|

170人浏览过

|

来源于php中文网

原创

联合索引字段顺序应按「区分度高 + 筛选性强 + 稳定性好」权衡,优先将高区分度字段(如 user_id)置最左,避免常量或倾斜字段(如 status=1 占95%)放最左,防止索引失效和回表放大。

mysql如何处理联合索引的数据倾斜_mysql索引组合优化

联合索引字段顺序怎么定才不踩坑

字段顺序直接决定索引能否命中,不是按查询频率排,而是按「区分度高 + 筛选性强 + 稳定性好」三者权衡。比如 status 只有 0/1,created_at 每秒都在变,user_id 有百万级唯一值——这时候把 user_id 放最左,比放最后有效十倍。

常见错误是把常量条件字段(如 is_deleted = 0)放在索引最左,结果全表扫描照旧。MySQL 只能高效使用索引的「最左前缀」,一旦遇到范围查询(>BETWEENLIKE 'abc%')或等值失效(IS NULL 后跟其他条件),右边字段就失效了。

  • WHERE user_id = 123 AND status = 1 AND created_at > '2024-01-01' → 推荐索引:(user_id, status, created_at)
  • WHERE status = 1 AND created_at > '2024-01-01' AND user_id = 123 → 同样走 (user_id, status, created_at),但 MySQL 会自动调整顺序匹配最左前缀
  • 如果 status 倾斜严重(95% 是 1),它就不该当最左字段;换成 (user_id, created_at, status) 更稳

数据倾斜时为什么 EXPLAIN 显示走了索引却很慢

因为 MySQL 优化器看到「走了索引」就以为万事大吉,其实底层在回表时遭遇了大量重复值——比如 status = 1 匹配 50 万行,哪怕 user_id 在索引里,也要逐条回主键查完整记录,I/O 爆涨。

典型现象:typerefrange,但 rows 高得离谱,Extra 出现 Using where; Using index 却响应超时。

  • SELECT COUNT(*) FROM t WHERE status = 1COUNT(*) WHERE status = 0 对比,确认倾斜程度
  • 对严重倾斜字段,考虑拆分查询:先用覆盖索引查出 ID 列表(加 LIMIT 控制数量),再用 IN 分批查详情
  • 避免在倾斜字段上建单列索引,它几乎没用;联合索引里它只能当「后缀」,且要配合高区分度字段前置

ORDER BY 和联合索引排序失效的几种情况

联合索引能避免文件排序(Using filesort),前提是 ORDER BY 字段顺序和索引定义完全一致,且所有排序方向相同(全 ASC 或全 DESC)。MySQL 8.0+ 支持混合方向,但 5.7 及以前一律不认。

Picsart AI Image Generator
Picsart AI Image Generator

Picsart推出的AI图片生成器

下载

更隐蔽的问题是:WHERE 条件用了范围,后面字段即使出现在 ORDER BY 里,也无法利用索引排序。

  • INDEX (a, b, c),查询 WHERE a = 1 AND b > 10 ORDER BY c → ✅ 有效
  • WHERE a > 1 ORDER BY b, c → ❌ bc 排序失效,因 a 是范围,索引从 b 开始已无序
  • WHERE a = 1 ORDER BY b ASC, c DESC(MySQL 5.7)→ ❌ 强制 Using filesort

什么时候该放弃联合索引,改用冗余索引或物化路径

当业务查询模式高度发散,比如同一张表既要按 (user_id, status) 查,又要按 (status, created_at) 查,还要按 (created_at, type) 查,硬凑一个联合索引只会让每个查询都慢半拍。

这时冗余索引不是浪费,而是止损。但要注意:冗余索引会拖慢写入,且 ALTER TABLE 加索引期间锁表(除非用 ALGORITHM=INPLACE)。

  • 优先保留高频、低延迟查询的索引,砍掉半年没被 EXPLAIN 过的
  • SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage 查真实使用率(需开启 performance_schema)
  • 对树形结构或层级关系强的数据,比方说分类、菜单,与其堆联合索引,不如存 path 字段(如 /1/5/23/),用前缀索引加速

最麻烦的不是建错索引,是建了之后没人看慢查日志、没人核对 Handler_read_* 指标。倾斜不会自己说话,它只在凌晨三点用超时告警敲你门。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

689

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

554

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

520

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

543

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

668

2023.08.14

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 857人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号