mysql查询出的结果排序乱_RDS MySQL排序分页查询数据顺序错乱的处理

免责声明:本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

问题描述

MySQL排序分页查询某些时候会出现数据顺序错乱的情况,例如alarm_test表结构如下所示。

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;

按照created_on字段值排序,取前10行,如下图。

df5fd0ccd7a8093eaa08e37b7ce2d5da.png

按照created_on字段值排序,取从11行开始的10行,如下图,可以看出2次排序分页操作得到的数据是有重合而且无序的。

dff662a7e179c87ed2cbfac7bcaccbf3.png

问题原因

排序分页结果会根据情况的不同而变化,结果不可预料。且created_on字段的值在前21行记录中有20行数据相同。

解决方案

阿里云提醒您:

如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

使排序字段有序的排序有如下两种方法。

修改排序规则,加入主键字段,使排序字段不存在重复记录,SQL语句如下所示。

select id, created_on from alarm_test order by created_on, id limit 0,10;

select id, created_on from alarm_test order by created_on, id limit 10,10;

系统显示类似如下。

d5ed6cc71738e1c4c210ada4ef0db714.png

在出现重复值的排序字段上添加索引,如下所示。

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

注:推荐使用添加索引的方法,在提供可预期的结果同时,提高查询的执行效率,如下图所示。

bd076093915f8847d7a15e7ebc1848b0.png

适用于

云数据库 RDS MySQL 版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值