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这个参数的大小,这样可以在排序过程中减少对数据的分段。
详细解决方案
mysql order by排序深入了解
热度:102 发布时间:2016-05-05 16:45:23.0
相关解决方案
- mysql 简单化 or能否实现
- 请问registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister
- MySQL 5.5 Command Line Client 窗口1输密码就退出
- 请问上Linux平台上怎么搭建JDK \TOMCAT\MYSQL
- 在LINUX上配置 MySQL 开机自动 启动
- mysql 转 orocle java ssh项目一条 sql 句不通!
- 急求帮忙!mysql 【 Column count doesn't match value count 】,该怎么解决
- jsp中的注册登录系统(mysql)
- 上了个 MySQL 5.5.25 但是安装时出错了
- 求jsp博客源代码mvc+mysql,该如何解决
- java mysql 中文乱码有关问题
- 请教各位,使用PreparedStatement mysql 数据库 不回滚,盼望解答。多谢。 具体如上
- mysql Statement parameter 一 not set
- java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306,该怎么处理
- MyBatis 读取 Mysql Blob类型的SQL如何写呢
- JDBC MYSQL 驱动加载失败 JSP DAO ECLIPSE,该怎么解决
- Only a type can be imported. com.mysql.jdbc.Driver resolves to a package解决方案
- tomcat 中抛异com.mysql.jdbc.exceptions.MySQLTransactionRollbackException,该如何处理
- struts+iBatis+mysql,该如何解决
- mysql 有外键的插入解决方案
- JSP 更新 MySQL 语句时遇到异常了= =
- mysql,该如何处理
- +++++ mysql 插入成功,查询不到记录?
- MyBatis3.1.1 Insert 回到主键 long类型 MYSQL 数据库
- mysql:假若一个表中,有两个属性name和id,删除同名的保留id小的,问这样写有误吗
- java mysql where限制有关问题
- mysql 数据库,如果信息存在调出,如果不存在转到另一个jsp中解决思路
- mysql jdbc的配置解决方案
- java.lang.ClassNotFoundException:com.mysql.jdbc.Driver,该如何解决
- 救助。Mysql 的条件删除语句如何写,就是删除部门的时候,如果部门下有用户,就不能删除