【MySQL】order by 结果不准确的问题及解决
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,一 介绍相信作为DBA 在和开发打交道的过程中,经常会遇到分页查询 order by 排序这样的需求。本文源于生产过程中的案例,5.6版本的数据库使用limit和order by 一个非唯一字段时,结
千家信息网最后更新 2026年11月03日【MySQL】order by 结果不准确的问题及解决一 介绍
相信作为DBA 在和开发打交道的过程中,经常会遇到分页查询 order by 排序这样的需求。本文源于生产过程中的案例,5.6版本的数据库使用limit和order by 一个非唯一字段时,结果集并不总是确定的.已经确定为bug,详见:MySQL 官方的bug
提醒读者朋友注意。
二 分析
环境准备
初始化数据
为a字段加上索引
从上面的测试来看对于一个非唯一字段 无论是否含有索引,结果集都是不确定的。
三 解决方法
1 业务属性确保 a 字段不能唯一,则需要针对排序结果再加上 一个唯一字段的排序 比如id
2 是否可以去掉不必要的order by,这个是由业务逻辑决定的。
四 总结
DBA在和开发沟通/培训过程中要注意这一点 基于非唯一字段的排序 结果集是不确定的。如果业务逻辑对分页或者order by结果集有比较高的严格要求 ,请记得利用唯一键排序。
相信作为DBA 在和开发打交道的过程中,经常会遇到分页查询 order by 排序这样的需求。本文源于生产过程中的案例,5.6版本的数据库使用limit和order by 一个非唯一字段时,结果集并不总是确定的.已经确定为bug,详见:MySQL 官方的bug
提醒读者朋友注意。
二 分析
环境准备
- CREATE TABLE `tb1` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `a` decimal(19,2) NOT NULL,
- `acid` bigint(20) NOT NULL,
- `prid` bigint(20) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_prid` (`prid`),
- KEY `idx_acid` (`acid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
初始化数据
- INSERT INTO `tb1` (`id`, `a`, `acid`, `prid`)
- VALUES (1,2.00,3,2),(2,3.00,3,2),(3,4.00,2,3),(4,5.00,2,3),(5,6.00,2,3),(6,8.00,2,3),(7,10.00,2,3),(8,12.00,2,3),(9,16.00,2,3),(10,20.00,2,3),(11,6.00,2,4),(12,8.00,2,4),(13,10.00,2,4),(14,12.00,2,4),(15,5.00,2,2),(16,6.00,2,2);
- mysql> select * from tb1 order by a desc limit 4;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 14 | 12.00 | 2 | 4 |
- | 8 | 12.00 | 2 | 3 |
- +----+-------+------+------+
- 4 rows in set (0.00 sec)
- mysql> select * from tb1 order by a desc limit 3;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 8 | 12.00 | 2 | 3 |
- +----+-------+------+------+
- 3 rows in set (0.00 sec)
为a字段加上索引
- mysql> alter table tb1 add key ind_tb1a(a);
- Query OK, 0 rows affected (0.00 sec)
- Records: 0 Duplicates: 0 Warnings: 0
- mysql> select * from tb1 order by a desc limit 3;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 8 | 12.00 | 2 | 3 |
- +----+-------+------+------+
- 3 rows in set (0.00 sec)
- mysql> select * from tb1 order by a desc limit 4;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 14 | 12.00 | 2 | 4 |
- | 8 | 12.00 | 2 | 3 |
- +----+-------+------+------+
- 4 rows in set (0.00 sec)
从上面的测试来看对于一个非唯一字段 无论是否含有索引,结果集都是不确定的。
三 解决方法
1 业务属性确保 a 字段不能唯一,则需要针对排序结果再加上 一个唯一字段的排序 比如id
- mysql> select * from tb1 order by a desc ,id desc limit 4;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 14 | 12.00 | 2 | 4 |
- | 8 | 12.00 | 2 | 3 |
- +----+-------+------+------+
- 4 rows in set (0.00 sec)
- mysql> select * from tb1 order by a desc ,id desc limit 3;
- +----+-------+------+------+
- | id | a | acid | prid |
- +----+-------+------+------+
- | 10 | 20.00 | 2 | 3 |
- | 9 | 16.00 | 2 | 3 |
- | 14 | 12.00 | 2 | 4 |
- +----+-------+------+------+
- 3 rows in set (0.00 sec)
2 是否可以去掉不必要的order by,这个是由业务逻辑决定的。
四 总结
DBA在和开发沟通/培训过程中要注意这一点 基于非唯一字段的排序 结果集是不确定的。如果业务逻辑对分页或者order by结果集有比较高的严格要求 ,请记得利用唯一键排序。
结果
字段
排序
索引
业务
过程
非唯
数据
逻辑
需求
开发
问题
一致
三个
不确定性
两个
官方
属性
常会
数据库
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技
中国互联网科技股
致骋互联网科技
百单互联网科技有限公司
天下捷融互联网科技
科技互联网的估值
移动互联网科技公司
宜昌元轩互联网科技有限公司
科技类公司包括互联网吗
互联网公司黑科技创始人
朱啸虎曾投资哪些互联网科技企业
互联网第三次科技革命特征
互联网科技数字货币
风投北京互联网科技
珠海东科互联网科技有限公司
好易买互联网科技
互联网的科技体现在哪里
亚光科技低轨卫星互联网
山东蛋芒互联网科技有限公司
互联网领先科技成果宣传视频
手冲咖啡和咖啡机区别
朗新科技与工业互联网
远信互联网科技
杭州互联网科技公司
互联网科技类展会
重庆威客帮互联网科技
互联网科技和医药行业
互联网科技大会大佬
保山浩联互联网科技有限公司
青岛互联网科技园