新聞中心
本篇文章給大家?guī)淼膬热菔顷P于MySQL優(yōu)化特定類型的查詢方法講解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
創(chuàng)新互聯(lián)公司從2013年開始,先為漣源等服務建站,漣源等地企業(yè),進行企業(yè)商務咨詢服務。為漣源企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
優(yōu)化關聯(lián)查詢
如果想要優(yōu)化使用關聯(lián)的查詢,我們需要特別留意以下幾點:
1、確保ON或者USING子句中的列上有索引。在創(chuàng)建索引的時候需要考慮到關聯(lián)的順序。當表A和表B用列c關聯(lián)的時候,如果優(yōu)化器的關聯(lián)順序是B、A,那么就不需要在B表的對應列上建索引。除非有其他理由,否則只需要在關聯(lián)順序的第二個表的對應列上創(chuàng)建索引,沒有用的索引只會帶來額外的負擔。
2、確保任何的GROUP BY 和 ORDER BY 中的表達式只涉及一個表中的列,這樣MySQL才有可能使用索引來優(yōu)化這個過程。
3、當升級MySQL的時候需要注意:關聯(lián)語法、運算符優(yōu)先級等其他可能會發(fā)生變化的地方。
優(yōu)化GROUP BY 和 DISTINCT
在很多場景下,MySQL都使用同樣的辦法優(yōu)化這兩種查詢,事實上MySQL優(yōu)化器會在內部處理的時候相互轉換這兩類查詢。它們都可以使用索引來優(yōu)化,這也是最有效的優(yōu)化辦法。
當無法使用索引的時候,GROUP BY使用兩種策略來完成:使用臨時表或者文件排序來做分組。對于任何查詢語句,這兩種策略的性能都可有可以提升的地方。我們可以通過提示 SQL_BIG_RESULT 和 SQL_SMALL_RESULT 來讓優(yōu)化器按照你希望的方式運行。
優(yōu)化LIMIT 分頁
在系統(tǒng)中需要進行分頁操作的時候,我們通常會使用LIMIT 加上偏移量的方法實現(xiàn),同時加上合適的ORDER BY 子句。如果有對應的索引,通常效率會不錯,否則,MySQL需要做大量的文件排序操作。
但是有一個非常常見又頭疼的問題就是,在偏移量非常大的時候,例如可能是 LIMIT 10000,20這樣的查詢,此時MySQL需要查詢10020 條記錄并只返回最后的20條,這樣的代價非常高。
如果所有的頁面被訪問的頻率都相同,那么這樣的查詢平均需要訪問半個表的數(shù)據(jù)。要優(yōu)化這種查詢,要么是在頁面中限制分頁的數(shù)量,要么是優(yōu)化大偏移量的性能。
優(yōu)化此類分頁查詢的一個最簡單的辦法就是盡可能地使用索引覆蓋掃描,而不是查詢所有的列。然后根據(jù)需要做一次關聯(lián)操作最后返回所需要的列。對于偏移量很大的時候,這樣做的效率會提高很多??紤]下面這個查詢:
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 )
這里的“延遲關聯(lián)”將大大提高查詢效率,它讓MySQL掃描盡可能少的頁面,獲取需要訪問的記錄后再根據(jù)關聯(lián)列回原表查詢所需要的所有列。
還有另外一種優(yōu)化的方法,就是使用應用程序記錄上次數(shù)據(jù)的位置,在下次查詢時就可以直接從該記錄的位置開始掃描,這樣就避免了使用OFFSET。
使用這樣的方法可以將其變成一個范圍查詢,無論翻頁到多后面,其性能都會很好。
關于MySQL優(yōu)化特定類型的查詢就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
當前題目:MySQL優(yōu)化特定類型的查詢方法講解
標題鏈接:http://www.dlmjj.cn/article/gdsids.html