當前位置:股票大全官網 - 股票投資 - mysql GROUP BY、DISTINCT和ORDER BY語句的優化

mysql GROUP BY、DISTINCT和ORDER BY語句的優化

GROUP BY、DISTINCT和ORDERBY的子句是類似的,GROUP BY也是默認排序的。在這本書裏,作者把它們歸為壹類,優化思路也差不多。

可以考慮的優化方法如下。

1,盡量少排序壹些行。

2.如果連接了多個表,ORDERBY列應該屬於連接順序中的第壹個表。

3.按索引排序。如果不能按索引排序,那麽EXPLAIN查詢語句會看到有壹個文件排序。

4.GROUP BY和ORDERBY語句引用的列應盡可能位於同壹表中。如果它們不在同壹個表中,請考慮冗余列或合並表。

5.必須確保index列和ORDERBY列相同,並且所有列都按相同的方向排序。

6.添加sort_buffer_size。Sort_buffer_size是為每個排序線程分配的緩沖區大小。增加該值可以加快ORDERBY或GROUP BY操作的速度。但是,這是為每個客戶端分配的緩沖區,所以不要將全局變量設置為較大的值,因為每個需要排序的連接都會被分配大小為sort_buffer_size的內存。

7.添加讀_rnd_buffer_size。當按排序順序讀取行時,通過緩沖區讀取行,從而避免搜索硬盤。將此變量設置為較大的值可以大大提高ORDER BY的性能。但是,這是為每個客戶端分配的緩沖區,因此您不應該將全局變量設置為較大的值。相反,只需為需要運行大型查詢的客戶機更改會話變量。

8.將tmpdir變量更改為指向基於內存的文件系統或其他更快的磁盤。如果MySQL服務器被用作復制從屬服務器,那麽“- tmpdir”不應該被設置為指向基於內存的文件系統的目錄或者當服務器主機重新啟動時將被清空的目錄。因為,對於復制從服務器來說,重啟機器時需要保留壹些臨時文件,以便復制臨時表或者進行LOADDATAINFILE操作。如果服務器重新啟動時臨時文件目錄中的文件丟失,復制將會失敗。

9.請指定ORDERBY NULL。默認情況下,MySQL會按組對所有查詢進行排序。如果希望避免消耗排序結果,可以指定ORDERBY NULL。例如:select count (*) CNT,cluster _ id from stat group by cluster _ id order by null limit 10;

10,優化GROUP BY WITHROLLUP。GROUP BY WITHROLLUP可以很容易的獲取整個組的超聚合信息,但是如果存在性能問題,我們可以考慮在應用層實現這個功能,這樣往往效率更高,擴展性更好。

11.使用非分組依據列,而不是分組依據列。比如原來是“按xx_name,yy_name分組”。如果GROUP BYxx_id可以得到相同的結果,那麽使用GROUP BYxx_id就可以了。

12,可以考慮用Sphinx等產品來優化語句組。壹般來說,它可以有更好的可擴展性和更好的性能。