Mysql 【order by 不唯一字段】与【limit】混用分析

坍缩析取
• 阅读 4044

背景:
分页查询排序后的数据,是一个非常常见的业务场景;但当使用不唯一的字段排序时,分两页查询的数据可能出现同一条数据,并丢失数据!

示例:
Mysql 【order by 不唯一字段】与【limit】混用分析
同样的查询条件,offset不同,竟然取到了同一条数据?!

原因解析(取自Mysql官方文档):
Mysql 【order by 不唯一字段】与【limit】混用分析
上面官方文档里面有提到如果你将Limit row_count与order by混用,mysql会找到排序的row_count行后立马返回,而不是排序整个查询结果再返回。如果是通过索引排序,会非常快;如果是文件排序,所有匹配查询的行(不带Limit的)都会被选中,被选中的大多数或者全部会被排序,直到limit要求的row_count被找到了。如果limit要求的row_count行一旦被找到,Mysql就不会排序结果集中剩余的行了。(此段取自网络)

总结(取自Mysql官方文档):
Mysql 【order by 不唯一字段】与【limit】混用分析
order by 后采用唯一的字段或字段组合,在上例中采用order by sku_id,id即可;

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
sql优化之大数据量分页查询(mysql)
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。谈优化前的准备工作为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子。表名:order\_history。描述:某个业务的订单历史表。主要字段
Wesley13 Wesley13
4年前
SQL
当数据库中数据量特别大的时候,查询的速度就比较慢,这时候需要添加索引,来提高查询速度。索引的优点1通过创建唯一索引,可以保证数据库表中每行数据的唯一性。2加快数据查询速度3在使用分组和排序进行数据查询时,可以显著的减少查询中分组和排序的时间索引的缺点1维护索引需要消耗数据库资源2索引需要占用磁盘空间,索引文件可能会比数据
Wesley13 Wesley13
4年前
java ssm框架实现分页功能 (oracle)
javaweb实现分页功能使用框架:ssm数据库:oracle话说oracle的分页查询比mysql复杂多了,在这里简单谈一下:查询前十条数据:1SELECTFROM(2SELECTROWNUMWN,RN.FROM(3
Wesley13 Wesley13
4年前
MySQL字段约束及多表查询
前言:mysql的字段约束是以后必不可免的,下面主要写了四个:主键约束用于唯一且不能为空;非空约束即不能为空可以重复;唯一约束即可以为空但必须唯一;外键约束是让表与表之间有一定的关联;当然如何使用还看下文,多表就不在这总结了。如果你对前面的知识有所遗忘或感兴趣MySQL数据库表的模糊/多行/分组/排序/分页查询以及字mysql数据类型的讲解
Wesley13 Wesley13
4年前
Mysql order by与limit混用陷阱
在Mysql中我们常常用orderby来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select\from表名orderby排序字段limtM,N。但是这种写法却隐藏着较深的使用陷阱。在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题。比如现在有一张user表,表结构及数据如下:
Wesley13 Wesley13
4年前
MySQL · 性能优化 · MySQL常见SQL错误用法
1\.LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create\_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。SELECTFROMoperationWHEREty
Stella981 Stella981
4年前
Node.js 使用 MongoDB 的 ObjectId 作为查询条件
当往MongoDB中插入一条数据时,会自动生成ObjectId作为数据的主键。那么如何通过ObjectId来做数据的唯一查询呢?在MongoDB中插入一条数据在MongoDB中插入一条如下结构的数据:{_id:5d6a32389c825e24106624e4,title:'
Wesley13 Wesley13
4年前
Mysql索引最佳实践笔记0524
mysql5.7innodb默认存储引擎一、关于索引二、最佳实践三、避坑实践一、关于索引1.索引的作用提高查询效率数据分组、排序避免回表查询优化聚集查询用于多表join关联查询利用唯一性约束、保证数据唯一性innodb行锁实现索引的“
Wesley13 Wesley13
4年前
Mysql 5.6 “隐式转换”导致的索引失效和数据不准确
背景在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个varchar字段有一个复合索引。其中的总条数有58989,甚至不加单引号查出来的数据不是我们想要的数据。使用的是mysql5.6版本,innoDB引擎实际情况如下
Wesley13 Wesley13
4年前
mysql组合索引与字段顺序
很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符。看下面的例子:假设有一张订单表(orders),包含order\_id和product\_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的s
研发日常踩坑-Mysql分页数据重复 | 京东云技术团队
踩坑描述:写分页查询接口,orderby和limit混用的时候,出现了排序的混乱情况在进行第N页查询时,出现与第一前面页码的数据一样的记录。问题在MySQL中分页查询,我们经常会用limit,如:limit(0,20)表示查询第一页的20条数据,limit