问题描述
数据分页时需要根据数据记录创建时间create_time字段倒序,即使用order by create_time desc limit ?,?,但是我们会发现,前端进行请求时获取的数据并不正确,分页中出现了一定的重复数据。
问题原因
期初还很好奇,总数没问题,总查询也没问题,为什么数据会重复了,然后会把部分数据给覆盖了。后来,通过查看SQL发现,是根据时间进行排序的,然而 这个时间 恰恰 好多数据都是 同一时间插入,或者 设置的 同一时间。
先后执行 总查询(也就是不分页),是没有重复。
再次执行分页查询,分两页查询就有了出路。(且,两次查询出来的数据和总查询数据不一样了)
后来 发现,当SQL中ORDER BY待排序字段值相同时,系统对数据的排序可能变得随机,即一会儿这条数据在前面,一会儿这条数据在后面了 ,所以当翻页的时候我们很容易便看到了重复的数据。
SQL中ORDER BY相同值结果乱序的具体原因
查阅了Goole和相关资料,大概总结了这种情况的原因。其实发生这种现象是“故意”设计的。
如果没有指定ORDER BY语句,则 MySQL (或任何RDBMS)不保证以特定顺序返回结果。 有些人认为,如果没有指定order by子句,行总是以聚簇索引顺序或物理磁盘顺序返回。 然而,这是不正确的,因为在查询处理期间可以改变行顺序的许多因素,例如并行的HASH连接是更改行顺序的操作符的一个很好的例子。
如果指定ORDER BY语句,MySQL将对行进行排序,并按请求的顺序返回。 但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”。
确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。
select member_id,create_time from member order by create_time desc,member_id;
总结
为了避免类似的问题,我们可以将主键(或者具有唯一性的字段)排序引入需要排序的业务字段后即可解决 。
问题描述数据分页时需要根据数据记录创建时间create_time字段倒序,即使用order by create_time desc limit ?,?,但是我们会发现,前端进行请求时获取的数据并不正确,分页中出现了一定的重复数据。问题原因期初还很好奇,总数没问题,总查询也没问题,为什么数据会重复了,然后会把部分数据给覆盖了。后来,通过查看SQL发现,是根据时间进行排序的,然而 这个时间 恰...
ORDER BY非稳定的
排序
提一个
问题
: oracle在order by
排序
时,是稳定
排序
算法吗? 发现用一个type进行
排序
后,做
分页
查询,
第一页
的
数据
和
第二页
的
数据
有
重复
怀疑是order by 时,两次排列的顺序不一致
看到业务描述的
问题
可以得到的结论order by
排序
不稳定,还有第一个印象就是,type肯定是不唯一的,并且没有索引吧。
这里先科普下
排序
的稳定性,举个最简单的例子,1,2,3,1,4,5
排序
排序
的结果是1,1,2,3,4,5,这时候观察这个1,如果第一个1还是
排序
前的那个1,那么算法是稳定的。也就是说相等数在
排序
后不发生交换。
还记得以前
数据
结构中的几种
排序
算法
记录开发过程中的一个坑 在开发过程中遇到的
问题
(菜鸡一枚,随笔勿喷)
问题
描述
数据
分页
时需要根据
数据
记录创建时间create_time字段倒序,即使用order by create_time desc limit ?,?,但是我们会发现,前端进行请求时获取的
数据
并不正确,
分页
中出现了一定的
重复
数据
。
问题
原因
期初还很好奇,总数没
问题
,总查询也没
问题
,为什么
数据
会
重复
了,然后会把
部分
数据
给覆...
mysql
查询
分页
,
第二页
出现了
第一页
中的
数据
行,
MySQL
在order by和limit混用的时候,出现了
排序
的混乱情况。
在
MySQL
5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即 使用了priority queue。
使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要
排序
,并且使用了limit n,那么只需要在
排序
的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要
排序
的开销,但是只需要 sort buffer
在我们在使用
mysql
进行
数据
查询时往往会遇到
数据
量过大需要
分页
展示的
问题
,这时候就会使用limit关键字:
SELECT * FROM table LIMIT [param1,] param2;
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。
通常时在使用limit时,会辅以order
使用
mysql
时的坑
mysql
分页
数据
重复
mysql
分页
数据
重复
最近线上反馈一个
问题
,某个列表接口,
第二页
的返回的
数据
里面有条
数据
和
第一页
的
重复
了。然后我去调了接口,确实会重现,并且一页10条和一页20条
数据
,接口返回的
数据
顺序不一样。
初看
sql
,又觉得没有
问题
。
select
uuid,
attendance_month_list
where
project_uuid in
and del_flag = 0
order by year d
可以回答这个
问题
。您可以使用以下
SQL
语句在
MySQL
中插入一行
数据
:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
请将 "table_name" 替换为您要插入
数据
的表名,将 "column1, column2, column3, ..." 替换为您要插入
数据
的列名,将 "value1, value2, value3, ..." 替换为您要插入的实际值。在第三行插入
数据
时,您需要确保列名和值的数量和顺序匹配。
TouTuZhongA: