MySQL查询缺失记录,记录⼀次orderby查询的数据丢失和乱序
问题
1. 问题场景
系统中有⼀个列表页,列表页的数据来⾃下⾯的表 t,表 t 中有30多条数据。列表页是分页显⽰的,30条数据显⽰了 3 页。现在出现的问题是点击第 2 页和第 3 页时,会显⽰第1页的部分数据,还有⼀部分数据查询不出来。经过调试发现不是业务代码的问题,⽽是分页 sql 出的问题。
transmission malfunction福克斯2. 问题定位
SELECT
*length在matlab什么意思
FROM Table t
ORDER BY t.is_fixation DESC limit ?,?复制代码
kindeditor任意文件上传这条语句是⼀个分页查询页⾯⽤的 sql。需要根据表 t 的 is_fixation 字段降序排序。其中 is_fixation 字段
没有索引,⽽且表 t 的 30 条数据中,is_fixation ⼀部分是 0 ,⼀部分是 1,如下:
3. 问题 sql 分析SELECTmysql语句顺序
35岁学习c语言晚吗*
FROM Table t
ORDER BY t.is_fixation DESC limit ?,?复制代码
该语句根据字段 is_fixation 降序排序,因为只有 30 条数据,默认的 mysql 引擎会将查询出来的数据放在内存中排序,排序算法⽤的是快速排序,⽽快速排序是不稳定的排序算法, 所以 is_fixation 为 0 的记录每次查询时都会被乱序排列,所以本来在第⼀页的数据显⽰到了第⼆页或者第三页,导致出现乱序和数据查询不出来的问题
4. 解决⽅案
类似爱情mv(1)可以给 is_fixation 字段添加索引,这样在数据插⼊表时就是有序的,查询出来时也不⽤采⽤快速排序等排序算法再排序了
(2)可以多加⼀列 id ⽤于排序,这样避免不稳定的排序算法带来的问题:SELECT
*
FROM Table t
ORDER BY t.is_fixation DESC, id limit ?,?复制代码
(3)不是⽅案的⽅案:如果表 t 的数据量很⼤,导致 MySQL 存储引擎选择归并排序算法时,就不会出现这个问题,因为归并排序是稳定的排序算法(⾛不⾛归并排序根据数据量来的,如果你explain中出现Using filesort不⼀定是指⽤外部排序,只是标识需要排序⽽已)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论