加入收藏 | 设为首页 | 会员中心 | 我要投稿 通辽站长网 (https://www.0475zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql排序不稳定问题

发布时间:2022-10-13 03:00:58 所属栏目:MySql教程 来源:转载
导读: 现象
当order by中的列具有相同的值时,每次查询到的顺序存在不一致的现象,如下:


类似的,在分页排序中,有的数据会在页面连续出现多次,有的数据则在数据中一次也不能出现。
为什么会

现象

当order by中的列具有相同的值时,每次查询到的顺序存在不一致的现象,如下:

在这里插入图片描述

在这里插入图片描述

类似的,在分页排序中,有的数据会在页面连续出现多次,有的数据则在数据中一次也不能出现。

为什么会出现此现象

PageHelper首先将前端传递的参数保存到page这个对象中,接着将page的副本存放入ThreadLoacl中,这样可以保证分页的时候mysql排序,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,重新拼装分页SQL,完成分页。

其中mysql通过采用limit分页。

public String getPageSql(String sql, Page page, RowBounds rowBounds, CacheKey pageKey) {
    StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);

    sqlBuilder.append(sql);
    sqlBuilder.append(" limit ?,?");
    return sqlBuilder.toString();
}

通过explain,查看sql的执行计划,在extra中显示如图

Using temporary表示由于排序没有走索引,因此创建了一个内部临时表。注意这里的临时表可能是内存上的临时表,也有可能是硬盘上的临时表。

Using filesort表示没有使用索引排序,它并不意味着在硬盘上排序,filesort与文件无关。消除Using filesort的方法就是让查询sql的排序走索引。

外部排序模式

mysql使用的排序模式有四种:

排序算法

前三种排序方式使用的算法是QuickSort,即对需要排序的记录生成元数据进行分块排序,然后再使用mergesort方法合并块,即使用到了快速排序及归并排序。而优先队列则使用堆排序。

其中快速排序,堆排序是不稳定的。

排序算法的稳定性指的是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。即如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。

快速排序的不稳定性发生在key与相遇点进行交换时。

堆排序的不稳定性发生在子节点与父节点进行交换时,将两个相同元素顺序打乱,5(left) 6(root) 5(right) -> 5 5 6,此时5(right)位于5(left)的左侧。

在这里插入图片描述

如何解决此问题 题外话

(编辑:通辽站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!