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