這篇文章帶給大家的內容是關於MySQL優化特定類型的查詢(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
優化關聯查詢
如果想要最佳化使用關聯的查詢,我們需要特別留意以下幾點:
1、確保ON或USING子句中的列上有索引。在建立索引的時候需要考慮到關聯的順序。當表A和表B用列c關聯的時候,如果優化器的關聯順序是B、A,那麼就不需要在B表的對應列上建立索引。除非有其他理由,否則只需要在關聯順序的第二個表的對應列上建立索引,沒有用的索引只會帶來額外的負擔。
2、確保任何的GROUP BY 和 ORDER BY 中的表達式只涉及一個表中的列,這樣MySQL才有可能使用索引來優化這個過程。
3、升級MySQL的時候需要注意:關聯語法、運算子優先權等其他可能會改變的地方。
優化GROUP BY 和DISTINCT
在許多場景下,MySQL都用相同的方法來最佳化這兩種查詢,事實上MySQL優化器會在內部處理的時候互相轉換這兩類查詢。它們都可以使用索引來優化,這也是最有效的最佳化方法。
當無法使用索引的時候,GROUP BY使用兩種策略來完成:使用臨時表或檔案排序來做分組。對於任何查詢語句,這兩種策略的效能都可有可以提升的地方。我們可以透過提示 SQL_BIG_RESULT 和 SQL_SMALL_RESULT 來讓優化器以你希望的方式運作。
優化LIMIT 分頁
在系統中需要進行分頁操作的時候,我們通常會使用LIMIT 加上偏移量的方法實現,同時加上合適的ORDER BY 子句。如果有對應的索引,通常效率會不錯,否則,MySQL需要做大量的檔案排序操作。
但有一個非常常見又頭痛的問題就是,在偏移量非常大的時候,例如可能是LIMIT 10000,20這樣的查詢,此時MySQL需要查詢10020 筆記錄並只回傳最後的20條,這樣的代價非常高。
如果所有的頁面被存取的頻率都相同,那麼這樣的查詢平均需要存取半個表的資料。要優化這種查詢,要么是在頁面中限制分頁的數量,要么是優化大偏移量的效能。
優化這類分頁查詢的一個最簡單的辦法就是盡可能地使用索引覆寫掃描,而不是查詢所有的欄位。然後根據需要做一次關聯操作最後傳回所需的列。對於偏移量很大的時候,這樣做的效率會提高很多。考慮下面這個查詢:
SELECT file_id, description FROM sakila.film ORDER BY title LIMTI 50, 5;
如果這個表很大,最好可以將這個查詢修改成下面這個樣子:
SELECT file.file_id, file.description FROM sakila.film INNER JOIN( SELECT film_id FROM sakila.film ORDER BY title LIMIT 50, 5 )
這裡的「延遲關聯」將大大提高查詢效率,它讓MySQL掃描盡可能少的頁面,取得需要存取的記錄後再根據關聯列回原表查詢所需的所有欄位。
還有另一個最佳化的方法,就是使用應用程式記錄上次資料的位置,下次查詢時就可以直接從該記錄的位置開始掃描,這樣就避免了使用OFFSET。
使用這樣的方法可以將其變成一個範圍查詢,無論翻頁到多後面,其效能都會很好。
以上是MySQL優化特定類型的查詢(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!