IT技术博客大学习 共学习 共进步

Mysql中的排序优化

Incessant 2009-10-11 22:35:06 累计浏览 5,601 次
本机暂存

     排序也就是我们说的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,这个字段也放到索引列中来避免排序。

默认情况下,MySQL排序所有GROUP BY col1,col2,...查询的方法如同在查询中指定ORDER BY col1,col2,...如果显式包括一个包含相同的列的ORDER BY子句,MySQL可以毫不减速地对它进行优化,尽管仍然进行排序,如果查询包括GROUP BY但你想要避免排序结果的消耗,你可以指定ORDER BY NULL禁止排序。例如:

    INSERT INTO foo

    SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,161)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,321)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,080)
  4. Mysql监控指南 (累计阅读 21,201)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,180)
  6. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 12,980)
  7. 15个最好的免费开源电子商务平台 (累计阅读 12,460)
  8. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,480)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,421)
  10. 数学之美:StackOverflow问答排名算法 (累计阅读 11,340)