`
annan211
  • 浏览: 462531 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mysql order by排序深入理解

阅读更多

mysql 排序篇

 mysql 排序,如果从比较深入的角度来讨论这个命题,这一节完全可以出一本书。在这里我们只做简单介绍。

 mysql排序,这个动作会出现在两个两个地方,一个是内存,另一个是磁盘文件。由关键字order by 驱动。具体的排序条件根据结果集的字段决定。
 
 1 mysql 排序的算法
   mysql 的排序算法分为两种,一种是单路排序,一种是双路排序。
   
   双路排序: 按照sql指定的条件将符合的数据从磁盘中读取出来,把每一条数据参与排序的列以及这一行数据在磁盘中的位置(row point 又叫指针信息)
   丢给缓冲区,就是sort buffer. 在缓冲区中完成排序,之后将排序结果丢给随机读取缓冲区(read_rnd_buffer),随机读取缓冲区根据指针信息再到磁盘中读取该行数据的
   其他信息,之后再将合并结果返回给客户端。
   很明显 这种排序方法产生了两次IO操作。
   
   单路排序: 按照sql指定的条件将符合的数据从磁盘中全部读取出来,之后丢给缓冲区sort buffer ,缓冲区根据用户指定的排序条件完成排序,将结果返回给客户端。
   这种排序方式是在mysql 4.1之后出现的,选择单路排序需要一定条件。
   
   相比之下,单路排序比双路排序确实减少了IO次数,降低了磁盘开销,但是这里必须提出,减少IO操作的代价是增加了内存消耗。这是典型的用空间换时间的
   例子。
   
   我们如何让mysql使用单路排序呢?
   1 查询语句所取出的字段类型大小总和要小于 max_length_for_sort_data。
   2 排序字段中不包含text和blob类型。
   
 2 order by 的实现与优化
   还是那句话,良好的性能多取决于良好的设计,尤其是schema的早期设计。不要寄希望于后期的所谓的优化或者重构,那会让你痛苦。
   schema设计,尽可能把频繁访问的属性和冷属性分离,尽可能把小属性和大属性存放在不同的表里。去除不需要的业务设计,这会增加服务器负担。
   
   在设计sql语句的时候,你需要小心仔细,必须想象你的sql处理的是较大数据规模的情况,明确知道应用程序和mysql各自的优劣,比如mysql擅长表之间的join操作,而且这已经被
   mysql的开发者们优化的非常好,那么你就让mysql处理表之间的join,应用程序对于一些复杂计算和逻辑关系的处理表现的轻松自如,那么你就应该让mysql避免这一块。
   mysql忌讳大范围的磁盘IO,或者频度非常高的IO操作,那么排序就尽可能的利用索引,完善的索引设计也是高性能的保证。排序的过程中尽可能使用索引字段作为order by的条件。
   
   明白小结果集驱动大结果集的道理。这一点很重要。select 一定要去除不必要返回的数据,忌讳select *,因为你不需要,如果不得不返回你这次查询根本不需要的数据,那么请
   重新审查你的schema设计。不要盲目增大 max_length_for_sort_data 字段,这样会使Mysql 不得不将数据分成很多段然后进行排序。为了减少使用临时表,我们可以适当增大
   sort buffer size这个参数的大小,这样可以在排序过程中减少对数据的分段。

   请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

分享到:
评论

相关推荐

    activiti5.9修复mysql order by 排序bug

    activiti5.9修复mysql order by 排序bug 详情见博客地址:http://blog.csdn.net/qq413041153/article/details/7740773#comments

    MYSQL order by排序与索引关系总结1

    MySQL中的ORDER BY排序与索引关系是数据库性能优化的关键因素之一。本文主要针对InnoDB存储引擎的B-Tree索引进行探讨,不涉及索引设计,而是关注如何有效利用索引来提升查询性能。 首先,遵循**最左前缀法则**是...

    深入解析mysql中order by与group by的顺序问题

    mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group ...

    解决Hibernate中MySQL的中文排序

    本文将深入探讨如何解决这些问题,确保MySQL数据库中的中文数据能按照正确的顺序进行排序。 首先,我们需要了解MySQL字符集的基础知识。MySQL支持多种字符集,如GBK、UTF-8等,它们用于存储和表示不同语言的字符。...

    MySQL Order By索引优化方法

    总之,理解`ORDER BY`和`GROUP BY`的索引优化策略,以及如何通过`EXPLAIN`分析查询计划,可以帮助我们有效地优化查询,避免不必要的`filesort`操作,从而提升MySQL数据库的性能。在设计索引时,应考虑查询语句的常见...

    mysql如何根据汉字首字母排序

    select areaName from area order by convert(areaName USING gbk) COLLATE gbk_chinese_ci asc 说明:areaName为列名 area为表名 PS:这里再为大家推荐一款本站的相关在线工具供大家参考: 在线中英文根据首字母...

    MySQL中Order By多字段排序规则代码示例

    在MySQL数据库中,`ORDER BY`子句用于对查询结果进行排序。在处理多字段排序时,MySQL遵循特定的规则来确定数据的排列顺序。本文将深入探讨这些规则,并通过代码示例进行解释。 首先,单字段排序是相对简单的。假设...

    MyBatisPlus条件构造器带条件排序方法orderBy、orderByDesc、orderByAsc使用示例代码

    在实际开发中,我们经常需要对查询结果进行排序,MyBatisPlus为此提供了`orderBy`、`orderByDesc`和`orderByAsc`三个方法,方便我们实现条件排序。下面将详细介绍这三个方法的使用及原理。 `orderBy`方法是...

    深度分析mysql GROUP BY 与 ORDER BY

    本文就和大家一起深入研究下mysql中group by与order by.下面是我模拟我的内容表   我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下   明显。这不是我想...

    mysql order by limit 的一个坑.docx

    问题的描述是这样的:当我们使用 ORDER BY 对某个字段进行排序,然后使用 LIMIT 限制返回的记录数时,如果排序字段有相同的值,MySQL 会随机选取这些行,而不是按照正常的排序顺序返回记录。这是一个非常隐蔽的坑,...

    Mysql中order by、group by、having的区别深入分析

    在MySQL数据库中,ORDER BY、GROUP BY 和 HAVING 子句是SQL查询中用于数据处理的关键组成部分,它们各自承担不同的任务,以帮助我们从数据库中提取有用的信息。 ORDER BY 子句主要用于对查询结果集进行排序。当你...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    MySQL中的`ORDER BY`和`GROUP BY`是SQL查询中两个关键的子句,它们用于对查询结果进行排序和分组。然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`...

    MySQL排序中使用CASE WHEN的方法示例

    在MySQL中,我们可以利用`CASE WHEN`来实现自定义排序,以满足特定的业务需求。以下是一个关于如何在MySQL排序中使用`CASE WHEN`方法的详细说明。 ### 1. `CASE WHEN` 基本语法 `CASE WHEN` 的基本语法如下: ```...

    mysql中count(), group by, order by使用详解

    在MySQL中,`COUNT()`, `GROUP BY`, 和 `ORDER BY` 是三个非常重要的SQL语句组成部分,它们各自承担着不同的职责,同时也常被结合在一起使用以满足复杂的数据查询需求。 `COUNT()` 是一个聚合函数,它用于计算指定...

    MySQL DQL - 排序查询.md

    本篇文章将详细介绍如何在 MySQL 中使用 `ORDER BY` 进行数据排序,并通过实例进行说明。 #### 基本语法 `ORDER BY` 子句的基本语法如下: ```sql SELECT column_name FROM table_name ORDER BY column_name [ASC...

    Mysql排序和分页(order by&limit)及存在的坑

    总之,`ORDER BY`和`LIMIT`是MySQL中用于数据排序和分页的关键工具,理解它们的用法并注意性能优化,能有效提升数据库查询的效率和用户体验。在实际应用中,应结合具体场景选择合适的排序和分页策略,以达到最佳效果...

    Mysql利用group by分组排序

    首先先按某个字段进行order by,然后把有顺序的表进行分组,这样每组的成员都是有顺序的,而mysql默认取得分组的第一行。从而得到每组的最值。 select id, (@rowno := @rowno + 1) as rank, score, (C.end_ti

Global site tag (gtag.js) - Google Analytics