问题描述:
RDS MySQL排序分页查询数据错乱的原因和解决
解决过程:
1. MySQL 排序分页查询某些时候会出现数据错乱的情况
比如:
CREATE TABLE alarm_test (
id bigint(20) NOT NULL DEFAULT '0',
detail varchar(255) CHARACTER SET utf8 NOT NULL,
created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
表内开始的 21 行数据:
注:第10行(id=10)的 created_on 字段值不同。
按照 Created_on 字段值排序,取前 10 行:
按照 Created_on 字段值排序,取从11行开始的 10 行:
可以看出,2次排序分页操作得到的数据是有重合而且无序的(实际上排序分页结果会根据情况的不同而变化,结果不可预料)。
出现这个问题的原因在于 created_on 字段的值在前 21 行记录中有 20行数据相同。
2. 如何使会出现相同数值的排序字段结果有序
有2个方法:
修改排序规则,加入主键字段,使排序字段不存在重复记录,比如:
在出现重复值的排序字段上添加索引
CREATE TABLE alarm_test_idx (
id bigint(20) NOT NULL DEFAULT '0',
detail varchar(255) CHARACTER SET utf8 NOT NULL,
created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY created_on (created_on)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
推荐使用第2种方法(创建索引),在提供可预期的结果同时,提高查询的执行效率:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。