MySQL優化特定類型的查詢(代碼示例)

本篇文章給大家帶來的內容是關于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。

使用這樣的方法可以將其變成一個范圍查詢,無論翻頁到多后面,其性能都會很好。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享