[加快SQL 搜尋] SQL查詢時 當資料量過大的時候,如果直接下ORDER BY 系統會跑很慢,該如何改善呢? [GOOGLE:SQL 查詢 慢]

[加快SQL 搜尋] SQL查詢時 當資料量過大的時候,如果直接下ORDER BY 系統會跑很慢,該如何改善呢? [GOOGLE:SQL 查詢 慢]

[加快SQL 搜尋] SQL查詢時 當資料量過大的時候,如果直接下ORDER BY 系統會跑很慢,該如何改善呢? [GOOGLE:SQL 查詢 慢]

資料來源:http://expect7.pixnet.net/blog/post/42409147

在MySQL 中一般我門直接下搜尋,通常都是直接下 SELECT * FROM table WHERE colnumA=”條件” ORDER BY  colnumA。

這樣的搜尋在少量的資料是沒有任何問題,但是當你全部的資料有有兩百萬筆去搜尋的時候,你會發現資料跑得很慢。

當你下ORDER BY的時候,資料庫會把全部兩百萬筆先做排序。排序完成之後,再來比對是否有你要的資料。在列出你要的資料。

查詢資料並不慢,但是會慢的重點在於排序,就可能占了70%的時間。

但是跟同事討論,也拿公司系統資料來做測試,有了以下的結論。

SELECT * FROM table WHERE colnumA=”條件” ORDER BY colnumA

單純直接查詢,大約花了18s。但是改用另一個方法。

SELECT A.* FROM (SELECT * FROM  table WHERE colnumA=”條件”….多個條件 ) AS A ORDER BY A.colnumA

就是先把結果查詢出來,可能查到的資料剩下1萬筆。那這樣的速度會比原來的速度快。

但是還有另一種方法,很奇妙,速度更快。

SELECT  * FROM (SELECT * FROM table WHERE 1) AS T INNER JOIN (SELECT 主鍵 FROM  table WHERE colnumA=”條件” ……) AS S ON T.主鍵=S.主鍵 ORDER BY  T.colnumA

用INNER JOIN 就感覺上,他做了總共做了三次搜尋,應該是更慢才對,可是我會說他很妙是因為,實測之後,他的速度是最快的。

 

在資料量龐大約200萬筆,下相同的條件查詢。

SELECT * FROM table WHERE colnumA=”條件”…多個條件 ORDER BY colnumA    花費時間平均19 s

SELECT A.* FROM (SELECT * FROM table WHERE colnumA=”條件”….多個條件 ) AS A ORDER BY A.colnumA 花費時間平均 8s

SELECT * FROM (SELECT * FROM table WHERE 1) AS T INNER JOIN (SELECT 主鍵 FROM table WHERE colnumA=”條件” ……) AS S ON T.主鍵=S.主鍵 ORDER BY T.colnumA  花費時間平均 7.5s

 

當然這不是唯一解!但是卻是可以參考的資料!

 

 

 


 


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *