Mysql中的排序优化
排序也就是我们说的order by,Mysql更强调的是把排序字段也放在索引中,不需要回表,这是理想的实现方式,如果通过索引没有办法获得有序的数据,MySQL通过将取得的数据在内存中进行排序然后再将数据返回给客户端,有两种排序算法:一种是首先根据相应的条件取出相应的排序字段和定位行数据的行指针信息,然后在 sort buffer 中进行排序,最后根据排序结果回表取出需要的字段返回给客户端。另一种排序是在排序时就直接取出需要返回的所有字段,这样可以避免两次读取行,排序原理如下:
1.读行匹配WHERE子句的行。
2.对于每个行,记录构成排序关键字和行位置的一系列值,并且记录查询需要的列。
3.根据排序关键字排序元组
4.按排序的顺序检索行,但直接从排序的元组读取需要的列,而不是再一次访问表。
为了避免速度变慢,第二种排序只用于排序元组中的extra列的总大小不超过max_length_for_sort_data系统变量值的时候。(将该变量设置得太高的的迹象是将看到硬盘活动太频繁而CPU活动较低)。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试下面的策略。
1・增加sort_buffer_size变量的大小
2.增加read_rnd_buffer_size变量的大小
相比调整max_length_for_sort_data参数,Mysql更倾向于如把order by starts,这个字段也放到索引列中来避免排序。
INSERT INTO foo
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL
建议继续学习:
- WEB系统需要关注的一些点 (阅读:14066)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:12110)
- 如何使用1M的内存排序100万个8位数 (阅读:10869)
- 快速排序(Quicksort)的Javascript实现 (阅读:10075)
- 腾讯-1亿个数据取前1万大的整数-题解答 (阅读:9026)
- 基于SSD的数据库性能优化 (阅读:7386)
- jQuery性能优化指南 (阅读:7303)
- 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序) (阅读:6167)
- 深入浅出交换类排序算法(冒泡排序,快速排序) (阅读:5971)
- 一次简单C程序的性能优化 (阅读:5582)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Incessant 来源: Incessant
- 标签: 优化 排序
- 发布时间:2009-10-11 22:35:06
- [66] Oracle MTS模式下 进程地址与会话信
- [66] Go Reflect 性能
- [65] 如何拿下简短的域名
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则