優化關聯查詢 如果想要優化使用關聯的查詢,我們需要特別留意以下幾點: 1. 確保ON或者USING子句中的列上有索引。在創建索引的時候需要考慮到關聯的順序。當表A和表B用列c關聯的時候,如果優化器的關聯順序是B、A,那麼就不需要在B表的對應列上建索引。除非有其他理由,否則只需要在關聯順序的第二個表的 ...
優化關聯查詢
如果想要優化使用關聯的查詢,我們需要特別留意以下幾點:
- 確保ON或者USING子句中的列上有索引。在創建索引的時候需要考慮到關聯的順序。當表A和表B用列c關聯的時候,如果優化器的關聯順序是B、A,那麼就不需要在B表的對應列上建索引。除非有其他理由,否則只需要在關聯順序的第二個表的對應列上創建索引,沒有用的索引只會帶來額外的負擔。
- 確保任何的GROUP BY 和 ORDER BY 中的表達式只涉及一個表中的列,這樣MySQL才有可能使用索引來優化這個過程。
- 當升級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。
使用這樣的方法可以將其變成一個範圍查詢,無論翻頁到多後面,其性能都會很好。