想要提高 ORDER BY 的速度,首先要看MySQL能否使用索引而非額外的排序過程。如果不能使用索引,可以試著遵循以下策略:
增加 sort_buffer_size 的值。
增加 read_rnd_buffer_size 的值。
修改 tmpdir,讓它指向一個有很多剩余空間的專用文件系統。如果使用MySQL 4.1或更新,這個選項允許有多個路徑用循環的格式。各個路徑之間在 Unix 上用冒號(':')分隔開來,在 Windows,NetWare以及OS/2 上用分號(';')。可以利用這個特性將負載平均分攤給幾個目錄。注意:這些路徑必須是分布在不同物理磁盤上的目錄,而非在同一個物理磁盤上的不同目錄。
默認情況下,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;
7.2.10 MySQL 如何優化 LIMIT
在一些情況下,MySQL在碰到一個使用 LIMIT row_count 但沒使用 HAVING
的查詢時會做不同的處理:
如果只是用 LIMIT 來取得很少的一些記錄, MySQL 有時會使用索引,但是更通常的情況是做一個全表掃描。
如果 LIMIT row_count 和 ORDER BY 一起使用,則MySQL在找到 row_count 條記錄後就會停止排序了,而非對整個表進行排序。