背景

6.5号,小编在 Aliyun 的论坛中发现一位开发者提的一个问题,说 RDS 发现了一个超级大BUG,吓的小编一身冷汗 = =!!
赶紧来看看,背景是一个RDS用户创建了一张表,在一个都是NULL值的非索引字段上进行了排序并分页,用户发现第二页和第一页的数据有重复,然后以为是NULL值的问题,把这个字段都更新成相同的值,发现问题照旧。详细的信息可以登录阿里云的官方论坛查看。

小编进行了尝试,确实如此,并且5.5的版本和5.6的版本行为不一致,所以,必须要查明原因。

原因调查

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。参考伪代码:

while (get_next_sortkey()){if (using priority queue)push sort key into queueelse{if (no free space in sort_keys buffers){sort sort_keys buffer;dump sorted sequence to 'tempfile';dump BUFFPEK describing sequence location into 'buffpek_pointers';}put sort key into 'sort_keys';}}if (sort_keys has some elements && dumped at least once)sort-dump-dump as above;elsedon't sort, leave sort_keys array to be sorted by caller.

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

之所以5.6出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

5.5 没有这个优化,所以也就不会出现这个问题。

解决方法

1. 索引排序字段
之前的月报中,我们讨论过三星索引的设计,其中第二条就是利用索引的有序性,如果用户在字段添加上索引,就直接按照索引的有序性进行读取并分页,从而可以规避遇到的这个问题。

2. 正确理解分页
还是要正确理解分页,分页是建立在排序的基础上,进行了数量范围分割。排序是数据库提供的功能,而分页却是衍生的出来的应用需求。在MySQL和Oracle的官方文档中提供了limit n和rownum < n的方法,但却没有明确的定义分页这个概念。还有重要的一点,虽然上面的解决方法可以缓解用户的这个问题,但按照用户的理解,依然还有问题:比如,这个表插入比较频繁,用户查询的时候,在read-committed的隔离级别下,第一页和第二页仍然会有重合。

分页一直都有这个问题,我们看分页常用的场景:1)早期的论坛 2)个人交易记录。这些场景都对数据分页都没有非常高的准确性要求。

究竟是不是BUG

究竟归于bug问题还是用户使用理解上的问题?

小编觉得应该分开看待这个问题,如果是排序的问题,那就算是BUG,如果是分页的这个问题,那它确实完成了order by的功能,也完成了limit n功能,那就不能说它是BUG,分页就纯粹变成了用户理解的问题了。

用户在使用数据库的时候常见的一些问题:

1. 不加order by的时候的排序问题
用户在使用Oracle或MySQL的时候,发现MySQL总是有序的,Oracle却很混乱,这个主要是因为Oracle是堆表,MySQL是索引聚簇表的原因。所以没有order by的时候,数据库并不保证记录返回的顺序性,并且不保证每次返回都一致的。

2. 分页问题
分页重复的问题,就如前面所描述的,分页是在数据库提供的排序功能的基础上,衍生出来的应用需求,数据库并不保证分页的重复问题。

3. NULL值和空串问题
不同的数据库对于NULL值和空串的理解和处理是不一样的,比如Oracle NULL和NULL值是无法比较的,既不是相等也不是不相等,是未知的。而对于空串,在插入的时候,MySQL是一个字符串长度为0的空串,而Oracle则直接进行NULL值处理。

MySQL · 答疑解惑 · MySQL Sort 分页相关推荐

  1. php数据库html文本,关于php,mysql,html的数字分页和文本_php

    请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 首先进行样式展示希望对大 ...

  2. 一对多分页查询mysql编写_一对多分页的SQL到底应该怎么写?

    1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...

  3. MySQL排序ORDER BY与分页LIMIT,SQL,减少数据表的网络传输量,完整详细可收藏

    文章目录 1.ORDER BY排序 2.LIMIT分页 1.ORDER BY排序 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 ...

  4. javabean 连接mysql_连接mysql的javabean实例+简单分页

    连接mysql的javabean实例+简单分页 rs.getString(user_id) rs.getString(user_name) rs.getString(user_mail) rs.get ...

  5. php超大树形分页,PHP+MySql千万级数据limit分页优化方案

    PHP+MySql千万级数据limit分页优化方案 1年前 阅读 2750 评论 0 喜欢 0 ### 原因 徒弟突然有个需求,就是他发现limit分页,页数越大之后,mysql的消耗越大,查询时间越 ...

  6. mysql一对多关联查询分页_mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection .... .... 这样的查询系统封装的通用分页查询是不对的,所以需要自己sql中加入分页解决 SELECT you.nick_nam ...

  7. MySQL中的排序与分页

    排序规则 默认使用数据添加时的顺序排列 使用 ORDER BY 子句排序 ASC(ascend): 升序(默认的可省略不写) DESC(descend):降序 ORDER BY 子句在SELECT语句 ...

  8. 关于mysql关联查询然后进行分页的问题

    今天使用mysql的关联查询进行分页的时候遇到了一个问题,以前在单表查询的时候没有遇到这一的情况. 场景还原: 一张评论表,一张回复表,属于一对多的关系. 刚开始使用下面这条sql语句进行查询. SE ...

  9. 用ajax+js+dom+php+mysql,方百度goole的分页~~~~~~~~哦!

    思路: 分页的实现逻辑 1.在mysql中如何查询区间数据   limit 起始行,要查询的行数 2.什么是分页   当我们的数据量比较大时候,一页显示不了就分页显示,可以增加用户的体验 3.实现分页 ...

  10. mysql $lt_MongoDB与Mysql常用命令解释

    本文旨在介绍MongoDB,Mysql的常用命令:将MongoDB 和传统的关系型数据库的常用命令对照起来学习,更加便于记忆和理解. MongoDB是由数据库(database/repository) ...

最新文章

  1. SourceInsight-显示文件完整路径
  2. linux 临时设置英文输入,Linux 设置 Rime 默认英文状态
  3. Android Prelink
  4. leetcode算法题--Bulls and Cows
  5. 为英文的windows 7打上简体中文语言包
  6. POJ2246 HDU1082 ZOJ1094 UVA442 Matrix Chain Multiplication题解
  7. 光流(二)--光流算法
  8. 26.leetcode160_intersection_of_two_linked_lists
  9. 机械振动的傅里叶变化分析技术
  10. 原创 subsonic指南中文 翻译
  11. Android对话框控件读写,Android 对话框控件
  12. 2月英语总结 —— 跟读 and topic
  13. 关于 JWT Token 自动续期的解决(根据其他文献参考写的)
  14. postgresql.conf log_rotation_size
  15. 金融去杠杆环境下,请聆听麦子金服财富投资者给出的答案
  16. 程序员公司实行996,加班费却只有10块!网友:我们20块
  17. scipy库 signal 导入_Python scipy.signal方法代码示例
  18. 优秀github博主
  19. 福昕阅读器【上下分屏】阅读同一个PDF,上下文对照参考阅读,非常方便
  20. 计算机动漫与游戏技术工资,计算机动漫与游戏制作专业是学什么的

热门文章

  1. Linux音频驱动-ALSA概述
  2. Android UI学习之EditText
  3. CentOS7下初始化PostgreSQL
  4. ffmpeg文档1:制作屏幕录像
  5. pcie16x能插1x的卡嘛?_关于电脑能正常进系统但是进bios黑屏的解决办法(DP线连接)...
  6. 1.5.2 Prime Palindromes 回文质数(构造回文)
  7. shell 计算代码运行时间
  8. 如何用代码实现tablewidget的表头_20210114:timsort是什么,如何用代码实现?
  9. LRU页面置换算法C语言实现
  10. linux增加临时编译bin,Linux Rpmbuild 包制作