iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql排序的特性是什么
  • 672
分享到

Mysql排序的特性是什么

2023-06-25 12:06:18 672人浏览 独家记忆
摘要

本篇内容主要讲解“Mysql排序的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql排序的特性是什么”吧!1、问题场景新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对

本篇内容主要讲解“Mysql排序的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Mysql排序的特性是什么”吧!

    1、问题场景

    新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对应的数据。由于数据量比较大,在查询数据库时采用了分页查询,每次查询1000条数据。

    自测正常,测试环境正常,上线之后运营反馈导出的数据有重复记录

    原本是以为业务逻辑问题,重新Review了一遍代码,依旧未找到问题原因。最后只好把sql语句拿出来单独执行,导出数据,对比发现竟然是SQL语句查询结果乱序导致的。

    2、原因分析

    查询语句以create_time进行倒序排序,通过limit进行分页,在正常情况下不会出现问题。但当业务并发量比较大,导致create_time存在大量相同值时,再基于limit进行分页,就会出现乱序问题。

    出现的场景是:create_time排序,当create_time存在相同值,通过limit分页,导致分页数据乱序。

    比如,查询1000条数据,其中有一批create_time记录值都为”2021-10-28 12:12:12“,当创建时间相同的这些数据,一部分出现在第一页,一部分出现在第二页,在查询第二页的数据时,可能会出现第一页已经查过的数据。

    也就是说,数据会来回跳动,一会儿出现在第一页,一会儿出现在第二页,这就导致导出的数据一部分重复,一部分缺失。

    查看了Mysql 5.7和8.0的官方文档,描述如下:

    If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other Words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

    上述内容概述:在使用ORDER BY对列进行排序时,如果对应(ORDER BY的列)列存在多行相同数据,(mysql服务器会按照任意顺序返回这些行,并且可能会根据整体执行计划以不同的方式返回。

    简单来说就是:ORDER BY查询的数据,如果ORDER BY列存在多行相同数据,Mysql会随机返回。这就会导致虽然使用了排序,但也会发生乱序的状况。

    3、解决方案

    针对上述问题,基本的解决思路是:避免ORDER BY列的值出现重复。因此,可以加入其他维度,比如ID等其他排序列。

    select * from tb_order order by create_time ,id desc;

    这样,在create_time相同时,会根据id进行排序,而id肯定是不同的,就再不会出现上述问题了。

    4、拓展知识

    其实,上述内容在Mysql的官网已经有明确说明,而且还举了例子。下面对官网的内容和例子做一个简单的汇总总结

    4.1 limit查询优化

    如果我们只是查询一个结果集的一部分,那么不要查询所有数据,然后再丢弃不需要的数据,而是要通过limit条件来进行限制。

    在没使用having条件时,Mysql可能会对limit条件优化:

    • 如果只查询几条数据,建议使用limit,这样Mysql可能会用到索引,而通常情况下Mysql是全表扫描;

    • 如果将limit row_countorder by结合使用,Mysql会在找到第一个row_count结果集后立刻停止排序,而不是对整个结果集进行排序。如果此时基于索引进行操作,速度会更快。如果必须进行文件排序,在找到row_count结果集之前,会对部分或所有符合条件的结果进行排序。但当找到row_count结果之后,便不会对剩余部分进行排序了。这种特性的一个表现就是我们前面提到的带有limit和不带limit进行查询时,返回的结果顺序可能不同。

    • 如果将limit row_count和distinct结合使用,Mysql会在找到row_count结果集唯一行后立马停止。

    • 在某些情况下,可以通过按照顺序读取索引(或对索引进行排序),然后计算摘要直到索引变化来实现group by。在这种情况下,limit row_count不会计算任何不必要的group by值。

    • 一旦MySQL向客户端发送了所需数量的行,就会中止查询,除非使用了SQL_CALC_FOUND_ROWS。在这种情况下,可以使用 SELECT FOUND_ROWS() 检索行数。

    • LIMIT 0会快速返回一个空集合,通常可用于检查SQL的有效性。还可以用于在应用程序中获得结果集的类型。在Mysql客户端中,可以使用--column-type-info来显示结果列类型。

    • 如果使用临时表来解析查询,Mysql会使用 limit row_count来计算需要多少空间。

    • 如果order by未使用索引,且存在limit条件,则优化器可能会避免使用合并文件,而采用内存filesort操作对内存中的行进行排序。

    了解了limit的一些特性,下面再回到本文的重点,limit row_countorder by结合使用特性。

    4.2 limit与order by结合使用

    在上面第二条中已经提到,limit row_countorder by结合呈现的特性之一就是结果返回的顺序是不确定的。而影响执行计划的一个因素就是limit,因此带有limit与不带有limit执行同样的查询语句,返回结果的顺序可能不同。

    下面示例中,根据category列进行排序查询,而id和rating是不确定的:

    mysql> SELECT * FROM ratings ORDER BY cateGory;+----+----------+--------+| id | category | rating |+----+----------+--------+|  1 |        1 |    4.5 ||  5 |        1 |    3.2 ||  3 |        2 |    3.7 ||  4 |        2 |    3.5 ||  6 |        2 |    3.5 ||  2 |        3 |    5.0 ||  7 |        3 |    2.7 |+----+----------+--------+

    当查询语句包含limit时,可能会影响到category值相同的数据:

    mysql> SELECT * FROM ratings ORDER BY category LIMIT 5;+----+----------+--------+| id | category | rating |+----+----------+--------+|  1 |        1 |    4.5 ||  5 |        1 |    3.2 ||  4 |        2 |    3.5 ||  3 |        2 |    3.7 ||  6 |        2 |    3.5 |+----+----------+--------+

    其中id为3和4的结果位置发生了变化。

    在实践中,保持查询结果的顺序性往往非常重要,此时就需要引入其他列来保证结果的顺序性了。

    当上述实例引入id之后,查询语句及结果如下:

    mysql> SELECT * FROM ratings ORDER BY category, id;+----+----------+--------+| id | category | rating |+----+----------+--------+|  1 |        1 |    4.5 ||  5 |        1 |    3.2 ||  3 |        2 |    3.7 ||  4 |        2 |    3.5 ||  6 |        2 |    3.5 ||  2 |        3 |    5.0 ||  7 |        3 |    2.7 |+----+----------+--------+mysql> SELECT * FROM ratings ORDER BY category, id LIMIT 5;+----+----------+--------+| id | category | rating |+----+----------+--------+|  1 |        1 |    4.5 ||  5 |        1 |    3.2 ||  3 |        2 |    3.7 ||  4 |        2 |    3.5 ||  6 |        2 |    3.5 |+----+----------+--------+

    可以看出,当添加了id列的排序,即使category相同,也不会出现乱序问题。这正与我们最初的解决方案一致。

    到此,相信大家对“Mysql排序的特性是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    您可能感兴趣的文档:

    --结束END--

    本文标题: Mysql排序的特性是什么

    本文链接: https://www.lsjlt.com/news/304393.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Mysql排序的特性是什么
      本篇内容主要讲解“Mysql排序的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql排序的特性是什么”吧!1、问题场景新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对...
      99+
      2023-06-25
    • Mysql排序的特性详情
      目录1、问题场景2、原因分析3、解决方案4、拓展知识4.1 limit查询优化4.2 limit与order by结合使用5、小结1、问题场景 新上线一个交易记录导出功能,逻辑很简单...
      99+
      2024-04-02
    • MySQL的特性是什么
      这篇文章主要介绍MySQL的特性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗...
      99+
      2024-04-02
    • CSS属性的排序是什么
      这篇文章主要介绍CSS属性的排序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 一个小的测试 这个例子就是要让你思考如何更快的找到右边距属性? Example#1 di...
      99+
      2024-04-02
    • MySQL的排序规则是什么
      MySQL的排序规则是根据指定的排序规则来确定查询结果的排序方式。MySQL支持多种排序规则,包括字母数字顺序、大小写敏感或不敏感、...
      99+
      2023-09-21
      MySQL
    • MySQL的主要特性是什么
      MySQL的主要特性是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、 内部和可移植性用C和C++编写。用C和C++写就。使用多种不同的...
      99+
      2024-04-02
    • MySQL中ICP的特性是什么
      MySQL中ICP的特性是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、ICP简述ICP:全称为Index Condition Pus...
      99+
      2024-04-02
    • MySQL中排序的原理是什么
      MySQL中排序的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在程序设计当中,我们很多场景下都会用 group by 关键字。...
      99+
      2024-04-02
    • MySQL 5.7 新特性是什么
      小编给大家分享一下MySQL 5.7 新特性是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!我们自豪的宣布 MySQL 5.7 稳定版开放下载了。 MySQL 5.7.9 是...
      99+
      2024-04-02
    • PHP自然语言排序的特点是什么
      本篇内容主要讲解“PHP自然语言排序的特点是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP自然语言排序的特点是什么”吧!我们通过对PHP的学习,知道它的stor()函数是用来进行数组排...
      99+
      2023-06-17
    • MySQL中事务的特性是什么
      MySQL中事务的特性有:原子性,是指事务要么全部被执行,要么就全部不被执行。一致性,是指事务必须使数据库从一个状态变换成另一个状态,必须处于一致性状态。隔离性,是指多个用户并发访问数据库时,多个并发事务之间要相互隔离。持久性,是指一个事务...
      99+
      2024-04-02
    • mysql间歇锁的特性是什么
      本篇内容介绍了“mysql间歇锁的特性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明加锁的基本单位是(next-keylock),...
      99+
      2023-06-20
    • mysql spring事务的特性是什么
      本篇内容主要讲解“mysql spring事务的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql spring事务的特性是什么”吧!说明支持原数据库事务的隔离级别,加入事务传播...
      99+
      2023-06-20
    • MySQL 表中的默认排序顺序是什么?
      MySQL 表中的默认排序顺序是升序。每当我们使用 ORDER BY 子句对表中的行进行排序时,MySQL 都会按升序给出输出,最小值在前。考虑以下来自名为“student”的表的示例 -mysql> Select * fr...
      99+
      2023-10-22
    • mysql排序去重的方法是什么
      在MySQL中,可以使用DISTINCT关键字来去重,用ORDER BY关键字来进行排序。 具体的语法如下: SELECT ...
      99+
      2024-04-09
      mysql
    • mysql分组排序的方法是什么
      MySQL中对分组进行排序可以使用ORDER BY子句来实现。在GROUP BY子句之后,可以使用ORDER BY子句来对分组进行排...
      99+
      2023-08-25
      mysql
    • mysql中utf8mb4的排序规则是什么
      在MySQL中,UTF8MB4排序规则是根据Unicode字符集定义的。Unicode定义了每个字符的排序顺序,根据字符的Unico...
      99+
      2024-04-09
      mysql
    • mysql排序优化的方法是什么
      MySQL排序优化的方法有以下几种: 索引优化:为排序的列创建索引,可以大幅提高排序的效率。可以考虑创建单列索引、组合索引或者覆...
      99+
      2024-04-09
      mysql
    • MySQL排序的内部原理是什么
      MySQL排序的内部原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。排序,排序,排序 我们通过explain查看My...
      99+
      2024-04-02
    • MySQL各版本的新特性是什么
      这篇文章将为大家详细讲解有关MySQL各版本的新特性是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、各版本的常用命令差异  show innodb statusG...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作