1.
多条件排序
:
根据喜欢数倒序(喜欢数相同时,根据创建时间倒序)查询状态为正常的10条记录。
SELECT * FROM aaa WHERE `status` = 1 ORDER BY love_count DESC, create_time DESC LIMIT 0,10;
*注意:
如果上述sql写为如此形式呢?
SELECT * FROM aaa WHERE `status` = 1 ORDER BY love_count, create_time DESC LIMIT 0,10;
由于默认排序是升序,DESC
关键字仅适用于在它前面的列名(
create_time
)
;不影响love_count
列的排序顺序。
所以,查询结果为:根据创建时间倒序,喜欢数升序,查询状态为正常的10条记录。
2.
排序的执行
:
分两种情况:
1) 存在索引,按索引顺序扫描。利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作;
2) 没有索引,使用filesort(文件排序),在使用explain语句的时候一般都会在extra中看到filesort。
当MySQL不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort
buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是
外排序)。
对于filesort,MySQL有两种排序算法:
(1)两遍扫描算法(Two passes),又名双路排序
实现方式是先将须要排序的字段和可以直接定位到相关行数据的指针信息取出,然后在设定的内存(通过参数sort_buffer_size设定)中进行排序,完成排序之后再次通过行指针信息取出所需的Columns。
注:该算法是4.1之前采用的算法,它需要两次访问数据,尤其是第二次读取操作会导致大量的随机I/O操作。另一方面,内存开销较小。
(2) 一次扫描算法(single pass),又名单路排序
该算法一次性将所需的Columns全部取出,在内存中排序后直接将结果输出。
注:
从 MySQL 4.1
版本开始使用该算法。它减少了I/O的次数,效率较高,但是内存开销也较大。如果我们将并不需要的Columns也取出来,就会极大地浪费排序过程所需要
的内存。在 MySQL 4.1 之后的版本中,可以通过设置 max_length_for_sort_data 参数来控制 MySQL
选择第一种排序算法还是第二种。当取出的所有大字段总大小大于 max_length_for_sort_data 的设置时,MySQL
就会选择使用第一种排序算法,反之,则会选择第二种。为了尽可能地提高排序性能,我们自然更希望使用第二种排序算法,所以在 Query
中仅仅取出需要的 Columns 是非常有必要的。
延伸一下:
当对连接操作进行排序时,如果ORDER
BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using
filesort”;否则,MySQL必须将查询的结果集生成一个临时表,在连接完成之后进行filesort操作,此时,EXPLAIN输出
“Using temporary;Using filesort”。
3.
排序优化:
如果想要增加ORDER
BY
的速度,首先看是否可以让MySQL
使用索引而不是额外的排序阶段。如果不能,可以尝试下面的策略:
·
增加sort_buffer_size
变量的大小。
·
增加read_
rnd_buffer_size
变量的大小。
·
更改tmpdir
指向具有大量空闲空间的专用文件系统。该选项接受几个使用round-robin(
循环)
模式的路径。在Unix
中路径应用冒号(
‘:
’)
区间开,在Windows
、NetWare
和OS/2
中用分号(
‘;
’)
。可以使用该特性将负载均分到几个目录中。注释:
路径应为位于不同物理
硬盘上的文件系统的目录,而不是同一硬盘的不同的分区。
默认情况下,MySQL
排序所有GROUP BY
col1
,col2
,...
查询的方法如同在查询中指定ORDER
BY
col1
,col2
,...
。如果显式包括一个包含相同的列的ORDER
BY
子句,MySQL
可以毫不减速地对它进行优化,尽管仍然进行排序。如果查询包括GROUP
BY
但你想要避免排序结果的消耗,你可以指定ORDER BY
NULL
禁止排序。例如:
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
参考书籍:《Mysql_High_Performance_高性能MySql》、《MySql手册》
分享到:
相关推荐
几种mysql利用sql语句进行距离排序的方法,亲测可用,大家可放心研究
以下是一个关于如何在MySQL排序中使用`CASE WHEN`方法的详细说明。 ### 1. `CASE WHEN` 基本语法 `CASE WHEN` 的基本语法如下: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ...
MySQL排序原理与案例分析 排序是数据库操作中的关键部分,MySQL提供了多种方法来处理排序需求。用户通常通过`ORDER BY`语句实现结果集的排序,但`GROUP BY`和`DISTINCT`语句也会隐含地进行排序。了解如何优化排序...
代码如下: select areaName from area order by convert(areaName USING gbk) COLLATE gbk_... 您可能感兴趣的文章:mysql的中文数据按拼音排序的2个方法mysql如何按照中文排序解决方案MySQL按照汉字的拼音排序简单实例
### MySQL之聚合查询、分组和排序 #### 聚合查询、分组与排序概述 聚合查询、分组和排序是关系型数据库系统中重要的数据处理方式之一,尤其是在MySQL这样的流行数据库管理系统中更是如此。这些操作可以帮助用户从...
SELECT 列名1,列名2,列名n FROM 表名 [WHERE] ORDER BY 排序条件1,表达式,别名 案例: # 按照学生成绩进行排序,从高到低。 SELECT * FROM Student ORDER BY score DESC; # 按照学生成绩进行排序,从低到高(默认是...
MySQL排序和获取排名是数据库操作中的常见需求,特别是在数据分析和报表生成时。在这个实例中,我们将探讨如何在MySQL中实现这个功能,以便更好地理解和应用。 首先,我们来看第一个实例代码: ```sql SELECT @i:=...
这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知识点,查询,子查询,分组,排序,常用函数,多表连接,视图,变量,存储过程,函数,分支结构,循环结构等等
│ 3_MySQL排序规则权重.mp4 │ 4_MySQL字符集空间消耗.mp4 │ 5_MySQL表分区介绍和优势.mp4 │ 6_MySQL表分区类型.mp4 │ 7_MySQL字表分区和NULL值特殊处理.mp4 │ 8_MySQL表分区管理.mp4 │ 作业.docx │ 作业及...
我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。 为了处理这种情况,MySQL提供了三大运算符: IS NULL: 当列的值是 ...
项目开发中列表展示页面涉及到一些条目的上下移动 ,由于数据量大时,服务端代码比较耗时, 所以我使用mysql 存储过程完成上下移动,比较通用方法,欢迎大家下载学习,共同进步
MySQL索引在数据库管理系统中扮演着至关重要的角色,它们能够显著提升查询和排序操作的效率。在本实例分析中,我们将深入探讨MySQL索引如何影响排序速度,通过具体的操作步骤和测试来展示其效果。 首先,创建一个名...
在使用Hibernate进行数据库操作时,可能会遇到MySQL数据库中文排序不正确的问题。这通常是由于字符集设置、数据库排序规则以及Hibernate的配置等因素导致的。本文将深入探讨如何解决这些问题,确保MySQL数据库中的...
**MySQL排序的必要性:** 1. **利用索引** - MySQL已有针对排序的索引,直接排序效率高。 2. **大数据量子集** - 如从百万行数据中取前10条,MySQL的索引加速效果显著。 3. **统计与聚合** - 一次性排序,多次调用,...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其在各种规模的企业和项目中都有广泛的应用。以下是一些关于MySQL的面试题目及其解析,涵盖了基础概念、数据类型、存储引擎、事务处理等多个方面。 1. 关于ID...
### MySQL介绍与性能优化 #### MySQL基本介绍 MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发。自1995年第一个公开版本发布以来,MySQL因其小巧、高效、成本低廉以及开放源代码的特性...
本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部原理,并介绍与排序相关的参数,最后会给出几个“奇怪”排序例子,来谈谈排序一致性问题,并说明产生现象的本质原因。 1.排序优化与...