广告
返回顶部
首页 > 资讯 > 数据库 >ORDER BY分类
  • 717
分享到

ORDER BY分类

2024-04-02 19:04:59 717人浏览 泡泡鱼
摘要

前言排序是数据库中的一个基本功能,Mysql也不例外。通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序在

前言

排序数据库中的一个基本功能,Mysql也不例外。通过Order by语句即能达到将指定的结果集排序的目的,

其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序

在实际业务场景中,一些开发的大牛动不动来个orderby,sql看起写的非常溜,而实际业务应用导致GAME OVER......

首先介绍mysql实现排序的内部原理,并介绍与排序相关的参数,最后结合实际给出几个"奇怪"排序,来谈谈排序一致问题

1、排序实现的算法:

对于不能利用索引避免排序的 SQL,数据库不得不自己排序功能以满足业务需求,执行计划中会出现"USING TEMPORARY; USING filesort",

有时候filesore并不意味着就是文件排序也有可能是内存排序,只有由参数sort_buffer_size和结果集大小确定。

MySQL内部排序主要有3种方式:常规排序、优化排序和优先队列排序,假设表结构如下:

CREATE TABLE `t1` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `col1` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,

  `col2` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,

  `col3` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `col1` (`col1`,`col2`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

SELECT col1,col2,col3 FROM t1 WHERE col1="100" ORDER BY col2;

    a.常规排序

(1).从表t1中获取满足WHERE条件的记录

(2).对于每条记录,将记录的主键+排序键(id,col2)取出放入sort buffer

(3).如果sort buffer可以存放所有满足条件的(id,col2)对,则进行排序;否则sort buffer满后,进行排序并固化到临时文件中。(排序算法采用的是快速排序算法)

(4).若排序中产生了临时文件,需要利用归并排序算法,保证临时文件中记录是有序的

(5).循环执行上述过程,直到所有满足条件的记录全部参与排序

(6).扫描排好序的(id,col2)对,并利用id去捞取SELECT需要返回的列(col1,col2,col3)

(7).将获取的结果集返回

从上述流程来看,是否使用文件排序主要看sort buffer是否能容下需要排序的(id,col2)对,这个buffer的大小由sort_buffer_size参数控制。此外一次排序需要两次io,一次是捞(id,col2),第二次是捞(col1,col2,col3),由于返回的结果集是按col2排序,因此id是乱序的,通过乱序的id去捞(col1,col2,col3)时会产生大量的随机IO。对于第二次MySQL本身一个优化,

即在捞之前首先将id排序,并放入缓冲区,这个缓存区大小由参数read_rnd_buffer_size控制,然后有序去捞记录,将随机IO转为顺序IO

    b.优化排序

常规排序方式除了排序本身,还需要额外两次IO。优化的排序方式相对于常规排序,减少了第二次IO。主要区别在于,放入sort buffer不是(id,col2),而是(col1,col2,col3)。由于sort buffer中包含了查询需要的所有字段,因此排序完成后可以直接返回,无需二次捞数据。这种方式的代价在于,同样大小的sort buffer,能存放的(col1,col2,col3)数目要小于(id,col2),如果sort buffer不够大,可能导致需要写临时文件,造成额外的IO。当然MySQL提供了参数max_length_for_sort_data,

只有当排序元组小于max_length_for_sort_data时,才能利用优化排序方式,否则只能用常规排序方式

    c.优先队列排序

为了得到最终的排序结果,无论怎样,我们都需要将所有满足条件的记录进行排序才能返回。那么相对于优化排序方式,

在空间层面做了优化黑盒加入了一种新的排序方式--优先队列,这种方式采用堆排序实现,堆排序算法特征正好可以解limit M,N 这类排序的问题,虽然仍然需要所有元素参与排序,但是只需要M+N个元组的sort buffer空间即可,对于M,N很小的场景,基本不会因为sort buffer不够而导致需要临时文件进行归并排序的问题。

对于升序,采用大顶堆,最终堆中的元素组成了最小的N个元素,对于降序,采用小顶堆,最终堆中的元素组成了最大的N的元素


2、排序优化与索引使用

为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索引是一个不错的方法。

因为索引本身也是有序的,如果在需要排序的字段上面建立了合适的索引,那么就可以跳过排序的过程,提高SQL的查询速度,\

通过一些典型SQL说明哪些可以利用索引减少排序,哪些不能,

1、select * from t1 order by col1,col2

2、select * from t1 where  col1="100" order by col2

3、select *from t1 col1>"100" order by col1 asc

4、select * from  t1 where col1="100" and col2>"100" order by col2

3、不能利用索引避免排序

通过索引扫描的记录数超过30%,变全表扫描

联合索引中,第一索引列使用范围查询

联合索引中,第一查询条件不是最左索引列

升降序不一致无法使用

排序字段在多个索引中无法使用(一个联合索引一个单列索引,一条SQL一次只能使用一个索引)

排序字段是单独的列无法使用索引

4、业务案例,添加合理的索引

    1、业务DDL:

    

ORDER BY分类

ORDER BY分类

    2、对原SQL执行计划的查看:

    ORDER BY分类

    3、优化后的SQL执行计划-1

    ORDER BY分类

   3、优化后的SQL执行计划-2

    ORDER BY分类

主要对原SQL进行改写以及添加相应的索引,即可实现SQL优化,运行效率的最优。

您可能感兴趣的文档:

--结束END--

本文标题: ORDER BY分类

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

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

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

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

下载Word文档
猜你喜欢
  • ORDER BY分类
    前言排序是数据库中的一个基本功能,MySQL也不例外。通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序在...
    99+
    2022-10-18
  • (转)MySQL ORDER BY 的实现分析
    作者:Sky.Jian | 可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接:http://www.jianzhaoyang.com/database/mysql_...
    99+
    2022-10-18
  • mysql GROUP BY 怎么 order by 排序
    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排...
    99+
    2023-09-09
    mysql 数据库 排序算法
  • mysql group by与order by的区别
    本篇内容介绍了“mysql group by与order by的区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2022-10-18
  • mysql order by 索引问题综合分析
    一,文章1 Mysql-索引失效 order by优化_orderby索引失效_zyk1.的博客-CSDN博客 总结: 0,索引 与 查询条件 与 排序字段关系,Using filesort出现场景 联合索引,最左匹配原则,不仅查询条件需要...
    99+
    2023-09-03
    mysql 数据库
  • mysql中count(), group by, order by怎么用
    这篇文章给大家分享的是有关mysql中count(), group by, order by怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysql中count(), gr...
    99+
    2022-10-18
  • MySQL5.7 实现类似 MySQL8.0 中 row_number() over(partition by ... order by ...) 函数的分组排序编号效果
    示例 现在这里有一张用户表 user,里面包含以下字段:ID 主键、USERNAME 用户名、PASSWORD 密码、COMPANY 公司、DEPT 部门、CREATE_TIME 创建时间。 IDUS...
    99+
    2023-09-24
    数据库 sql mysql
  • 说Mysql的distinct语句和group by,order by
    最近,在做一个项目的时候,发现得出的数据于预料的相差很多,仔细的研究了一下,发现问题出在 distinct语句和groupy by,order by首先,distinct语句,获得非重复的(唯一)行记.gr...
    99+
    2022-10-18
  • mysql中order by如何用
    本篇内容主要讲解“mysql中order by如何用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中order by如何用”吧! ...
    99+
    2022-10-19
  • MySQL中ORDER BY怎么用
    这篇文章主要介绍MySQL中ORDER BY怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!总的来说,在 MySQL 中的ORDER BY有两种排序实现方式,一种是利用有序索引获...
    99+
    2022-10-19
  • mysql中order by的用法
    mysql中order by的用法:使用语法“SELECT 字段名 FROM 表名 ORDER BY 按什么字段排序”;主要是用来对结果集按照一个列或者多个列进行排序;在使用order by关键字时是默认按照升序对记录进行排序的,如...
    99+
    2022-10-17
  • Group By和Order By一起使用的问题
    又是那个百万级数据的数据库表……原本使用分组后查询语句正常运行,现在新的需求要求每个分组的数据显示最新一条,未加Order By之前的查询语句如下,每个分组数据会默认取第一条 SELECT * FROM table1...
    99+
    2023-09-13
    数据库 sql mysql
  • MySQL group by和order by如何一起使用
    假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) NOT...
    99+
    2022-05-27
    MySQL group by order by
  • 关于 Order by 2的解释
     Order by 2表示对要查询的第二个字段进行排序,如下例子: Select number,name From Student Order by 2 #相当于 Select number,name From ...
    99+
    2020-10-06
    关于 Order by 2的解释
  • Oracle系列:(7)order by子句
    查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按oracle内置的校验规则排序select empno,ename,sal,sal*12  f...
    99+
    2022-10-18
  • MySQL中Order By如何使用
    这篇文章将为大家详细讲解有关MySQL中Order By如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 ORDER BY uid ASC 按照u...
    99+
    2022-10-18
  • 怎么使用MySQL中order by
    本篇内容主要讲解“怎么使用MySQL中order by”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用MySQL中order by”吧!1、简介在使用select语句时可以结合o...
    99+
    2023-06-25
  • ORDER BY clause is not in SELECT list
    Expression #1 of ORDER BY clause is not in SELECT list 1、mysql查询异常:2、解决办法:2.1、查看是否开启了only_full_g...
    99+
    2023-09-20
    mysql 数据库 java
  • sql中order by和group by的区别是什么
    sql中order by和group by的区别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。order by 从英文里...
    99+
    2022-10-18
  • mysql查询语句group by和order by的使用
    这篇文章主要讲解了“mysql查询语句group by和order by的使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql查询语句group b...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作