Mysql order by 乱序导致分页取值问题

SQL优化的7个方向(慢查询从这里排查就好了) Mysql 的7个优化方向以及方案 阅读详情

背景:生产巡检发现第一页和第二页商品重复

分析后发现是sql语句中使用order by子句,但是排序字段的值都是一样的,导致排序后分页取值错乱。

 

复现:

建表语句:

create table test(
    id int,
    order1 int,
    order2 int,
    order3 int
);

insert into test value (1,10,null,100);
insert into test value (2,10,null,100);
insert into test value (3,10,null,100);
insert into test value (4,10,null,100);
insert into test value (5,10,null,100);
insert into test value (6,10,null,100);
insert into test value (7,10,null,100);
insert into test value (8,10,null,100);
insert into test value (9,10,null,100);
insert into test value (10,10,null,100);
insert into test value (11,10,null,100);
insert into test value (12,10,null,100);
insert into test value (13,10,null,100);
insert into test value (14,10,null,100);
insert into test value (15,10,null,100);
insert into test value (16,10,null,100);
insert into test value (17,10,null,100);
insert into test value (18,10,null,100);
insert into test value (19,10,null,100);
insert into test value (20,10,null,100);

第一页数据:
select * from test order by order1,order2,order3 desc limit 0,10;

第二页数据:

select * from test order by order1,order2,order3 desc limit 10,20;

由于排序字段值相同,此处排序后取分页数据已经发生错乱。

所以在使用排序取分页时,一定要注意确保有一个排序字段能唯一确定一条记录。

 

此处可以加上id进行排序,放在最后作为兜底的排序字段,结果如下:

select * from test order by order1,order2,order3 desc,id limit 0,10;

select * from tt order by order1,order2,order3 desc,id limit 10,20;

如图,排序和分页已正常。


 

MySQL中“ORDER BY“结果不准确的问题及解决 例如,如果我们使用的是UTF-8字符集,可以使用"COLLATE utf8_general_ci"来进行不区分大小写的排序,或使用"COLLATE utf8_bin"进行区分大小写的排序。在使用MySQL中的"ORDER BY"语句时,可能会遇到排序结果不准确的问题。这些问题可以通过使用COLLATE子句指定排序规则、将数值列转换为数值类型、将日期列转换为日期类型等方法来解决。然而,有时候我们可能会遇到"ORDER BY"结果不准确的问题,即排序结果与我们期望的不一致。 阅读详情

相关推荐

NU1680无线充电接收器在TWS耳机中的应用实战:I2C调压与QI协议适配

本文详细解析了NU1680无线充电接收器在TWS耳机充电仓设计中的应用实战。重点阐述了其无固件设计、I2C接口动态调压功能如何解决不同QI协议发射器的兼容性难题,并分享了硬件设计、PCB布局、与发射端联调及安全测试等关键环节的实践经验,助力开发者快速实现稳定高效的无线充电方案。

weixin_28432777的博客 233

mysql中使用order by排序后乱序问题

在Mysql中对某一个字段进行排序的时候,发现使用order by 语句之后数据竟然是乱序的。 问题原因: 我的表中的sort_num字段的类型设置成了varchar类型。 解决方法: 将字段类型改成int类型就解决了。 ...

Horse7的博客 3749

ArcGIS实战:地形湿度指数(TWI)计算全流程解析

本文详细解析了ArcGIS中地形湿度指数(TWI)的计算全流程,从DEM数据获取、填洼处理到水流方向与汇流累积量计算,最终实现TWI的精准计算。通过实战步骤指导,帮助读者掌握水文建模和土壤湿度预测的关键技术,适用于农业规划、生态研究等领域。

weixin_29231725的博客 869

mysql orderby+分页 乱序原因和解决

在 orderby 的字段具有相同的值的时候,使用orderby + 分页可能造成乱序. 而且,相同的查询条件,是否使用limit 返回的查询结果也可能不一样。

weixin_43171234的博客 847

关系代数表达式优化步骤

关系代数表达式优化步骤 本篇主要讲解怎么画查询语法树并对其优化,因为我在学关系代数的语法树的时候,在网上找不到比较详细的教法或者技巧,最后通过答案反推原理,所以想写一篇技巧来描述一下这类题的解题方法。 先上书内讲解 1、构造查询树 第一步:把用高级语言定义的查询转换为关系代数表达式 ★ 以 SELECT子向对应投影操作,以FROM字向对应笛卡尔积以 WHERE子句对应选择操作,生成原始查询树 ★ SQL语句转化为原始查询树 第二步:把关系代数表达式转换为查询树。 注: 查询树是一种表示关系代数表达式的树形结

m0_51718449的博客 7016

WSL2迁移后用户名不见了?一招教你快速恢复Ubuntu22.04默认用户

本文针对WSL2迁移后Ubuntu 22.04默认用户名丢失的常见问题,提供了详细的诊断与修复方案。通过分析迁移底层逻辑,指导用户使用`ubuntu2204.exe config --default-user`命令或配置`/etc/wsl.conf`文件快速恢复用户身份,并涵盖权限修复、冲突解决及自动化迁移脚本等进阶内容,确保子系统迁移后环境完整可用。

web39explorer的博客 558

【MySql】MySQL排序分页查询数据顺序错乱的原因和解决办法

mysql对无索引字段进行排序后limit ,当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值,有可能第一页查询的记录,重复出现在第二页的查询记录中,而且第二页的查询结果乱序,导致分页结果查询错乱问题。

No8g攻城狮的博客 1万+

从零开始学习AI人工智能本体论:概念与实战

本文旨在为初学者提供一个全面而易于理解的人工智能本体论入门指南。我们将覆盖从基本概念到实际应用的全过程,帮助读者理解本体论在AI系统中的核心作用。核心概念与联系:介绍本体论的基本概念和原理核心算法与操作步骤:详细讲解本体构建和推理方法项目实战:通过实际案例展示本体论的应用实际应用场景:探讨本体论在不同领域的应用未来发展趋势:展望本体论在AI领域的前景本体论(Ontology): 在AI中,指对特定领域概念及其关系的明确形式化描述。

AI智能探索者的博客 868

order by 与 分页 的冲突

该表中的数据涉及到批量更新操作,会导致大量数据的列属性值都相同,导致执行时发现传入的页数不同时,分页的数据会出现重复!

Lionel_SSL的博客 751

30分钟用 Restful ABAP Programming(RAP)模型开发一个支持增删改查的 Fiori 应用

2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Driven Development,即通过开发维护了对应annotation(注解)的CDS view,结合SAP WebIDE,能够花费最少的编程代价,就能够在短时间内获得一个支持增删改查的Fiori应......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5952

基于XDMA 的PCIE读写DDR

基于XDMA 的PCIE读写DDR 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。 实现功能:PC通过PCIE读写DDR,同时用户通过逻辑代码可以读取被写入DDR内的数据(我是通过VIO实现DDR任意地址,任意数据大小的读取。)。 实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 P

Crazzy_M的博客 1万+

group by后乱序问题原因和解决

group by后乱序问题原因和解决 1.问题 求用户的访问轨迹以特殊分隔符隔开(已经有数仓表记录用户访问顺序) ## 模仿一下数仓用户访问顺序表 CREATE TABLE IF NOT EXISTS tmp_t ( uid STRING, page_id STRING, rn BIGINT ) ; insert overwrite table tmp_t values ('u-1057','3305','1'), ('u-1057','3342','

4056

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MySQL的其它优化

MySQL的其他优化

weixin_39757139的博客 415

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL之sql优化:intsert、主键、order by、group by等

大批量插入数据如果一次性需要插入大批量地数据,使用insert语句插入性能较低,此时使用MySQL数据库提供地load指令进行插入下图第三条语句表示讲/root/sql.log通过load插入到表tb_user中,每个字段用‘,’分割,每行数据用‘\n’分割。

qq_62636650的博客 790

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL数据库调优————ORDER BY语句

这句SQL是用到了索引排序的,当执行查询时,查找出来的数据为[‘Bader’,last_name[i],emp_no],因为索引是有序的,'Bader’是确定的,那么数据已经按照last_name排好序了,就跳过了排序的环节。根据执行结果是使用了索引的,因为在执行查询语句时,查找出来的数据为[first_name,last_name,emp_no],这一部分数据已经是按照first_name排好序的,所以不需要再次进行排序了。因为索引中的两个字段,在进行排序中的升降序不一致,所以无法使用索引。

weixin_38910645的博客 740

08MySQL性能优化:7大技巧提升查询速度

多字段排序时,要按照索引的字段顺序排序;尽量使用覆盖索引;如果无法避免排序,可以适当增大排序缓冲区sort_buffer_size的参数(默认为256k)

zbdjdmm的博客 809

MySQL优化相关

语句是在命令行中执行,并不是在sql行执行的,test_db表示要备份的数据库,‘>’ 表示指定备份文件放在什么位置。

bai_ke_yuan的博客 706

【MySQL学习】 进阶篇 Day4 SQL优化与视图

批量插入:insert into 表名 values …;手动提交事务:执行insert之前开启事务,多条insert之后手动提交,避免频繁的事务开启提交主键顺序插入:主键顺序插入性能高于乱序插入。插入大量数据:如果一次性需要插入大量数据,使用insert插入性能较低,可以使用lode指令加载本地文件到数据库中页分裂:当主键乱序插入时,每次添加数据MySQL为了将新数据插入到合适的位置,主键索引树会重新进行排序和数据移动,增加了开销。

weixin_56858526的博客 587

MySQL进阶篇——sql优化

MySQL数据库性能优化:1)INSERT优化;2)主键优化;3)ORDER BY优化;4)GROUP BY优化;5)LIMIT优化;6)COUNT优化;7)UPDATE优化;

m0_52125435的博客 568

MySql007——检索数据:排序检索数据(ORDER BY的使用,包括排序和取最大最小值)

前提:使用中创建的products表。

weixin_45084986的博客 512

MySQL优化(SQL优化)

MySQL优化(SQL优化) 前导内容:MySQL索引篇 一、SQL优化 1.插入优化 1.单条插入效率较低我们使用批量插入 2.手动提交事物 3.按主键的顺序插入 大批量数据插入使用load命令可以大大提升效率 mysql --local-infile -u root -p #客户端连接服务器 set global local_infile = 1; #设置全局参数为1,开启本地文件导入数据的开关 load data local infile '文件路径' into table '表名' fields

爱跳舞的Coder的博客 479

Mysql——SQL调优

在单列索引范围优化中,同学们可能会想,假如where条件就是无法精简成单个索引的范围查找怎么办,还有办法,先精简成多个索引的范围查找,然后再搭配索引合并优化。将使用and/or连接的不同索引的若干条件分别查询,将得到的结果对应的主键id做交集或者并集然后根据主键id取出相应结果。为什么“如果前一个条件是范围比较,在此之后的符合索引中的所有列就不再能再利用复合索引来缩小查找范围了”对条件确定的复杂多表 JOIN,可拆分为多个单表查询,在程序中合并结果,降低服务器压力。

2302_80221042的博客 660

MySQL学习笔记-05(SQL优化)

MySql优化工具、MySql优化

weixin_41016739的博客 2852

SQL优化学习笔记

本文总结了SQL优化的关键方法:1)插入优化:批量插入、手动提交事务、主键顺序插入,大数据量使用load指令;2)主键优化:避免页分裂/合并,设计短且有序的主键;3)排序分组优化:利用索引避免临时表;4)分页优化:子查询+覆盖索引;5)计数优化:count(*)效率最高;6)更新优化:确保where条件使用索引避免锁升级。核心是通过索引优化减少I/O和锁竞争,提升查询性能。<|end▁of▁sentence|>

程序员伊成 1271

mysql进阶篇之SQL优化(三)

学习

weixin_55417005的博客 1006
上一篇: 集群技术
下一篇: Elasticsearch 国内镜像下载地址
几十米阳光
博客等级 码龄17年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值