溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL優(yōu)化語句執(zhí)行的方法有哪些

發(fā)布時間:2022-01-15 17:24:30 來源:億速云 閱讀:116 作者:iii 欄目:數(shù)據(jù)庫

這篇文章主要介紹“MySQL優(yōu)化語句執(zhí)行的方法有哪些”,在日常操作中,相信很多人在MySQL優(yōu)化語句執(zhí)行的方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL優(yōu)化語句執(zhí)行的方法有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

like 前導(dǎo)符優(yōu)化

like模糊查詢形如'%AAA%'和'%AAA'將不會使用索引,但是業(yè)務(wù)上不可避免可能又需要使用到這種形式。

通常的方法有兩種:

  • 優(yōu)化方案一:使用覆蓋索引,即查詢出的列只是用索引就可以獲取,而無須查詢表記錄,這樣也走了索引;

  • 優(yōu)化方案二:使用locate函數(shù)或者position函數(shù)代替like查詢:如table.field like '%AAA%'可以改為locate('AAA',  table.field) > 0或POSITION('AAA' IN table.field)>0

in 和 exist

如果查詢的兩個表大小相當(dāng),那么用in和exists差別不大。 如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:  例如:表A(小表),表B(大表)

示例一:

MySQL優(yōu)化語句執(zhí)行的方法有哪些

示例二:

MySQL優(yōu)化語句執(zhí)行的方法有哪些

not in 和 not exist

如果查詢語句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒有用到索引;而not exist 的子查詢依然能用到表上的索引。所以無論哪個表大,用not  exists都比not in要快!

MySQL優(yōu)化語句執(zhí)行的方法有哪些

子查詢優(yōu)化

  • MySQL 5.6  之前的版本對子查詢處理:不會將查詢的結(jié)果集計(jì)算出來用作與其他表做join,outer表每掃描一條數(shù)據(jù),子查詢都會被重新執(zhí)行一遍。

  • MySQL 5.6 對子查詢的處理 :將子查詢的結(jié)果集 cache  到臨時表里,臨時表索引主要用來移除重復(fù)記錄,并且隨后也可能用于做join查詢,這種技術(shù)在 5.6  中叫做物化的子查詢,物化子查詢可以看到select_type字段為subquery,而在 5.5 里為DEPENDENT SUBQUERY。

  • 子查詢一般都可以改成表的關(guān)聯(lián)查詢,子查詢會有臨時表的創(chuàng)建、銷毀,效率低下。

MySQL優(yōu)化語句執(zhí)行的方法有哪些

straight_join

mysql hint:

Mysql 優(yōu)化器在處理多表的關(guān)聯(lián)的時候,很有可能會選擇錯誤的驅(qū)動表進(jìn)行關(guān)聯(lián),導(dǎo)致了關(guān)聯(lián)次數(shù)的增加,從而使得sql語句執(zhí)行變得非常的緩慢。

這個時候需要有經(jīng)驗(yàn)的DBA進(jìn)行判斷,選擇正確的驅(qū)動表,這個時候 straightjoin  就起了作用了,下面我們來看一看使用straight_join進(jìn)行優(yōu)化的案例:

嘗試采用user表做驅(qū)動表,使用straight_join強(qiáng)制連接順序:

MySQL優(yōu)化語句執(zhí)行的方法有哪些

高效分頁

傳統(tǒng)分頁:

select * from table limit 10000,10

limit原理:

  • Limit 10000,10

  • 偏移量越大則越慢

推薦分頁:

MySQL優(yōu)化語句執(zhí)行的方法有哪些

復(fù)雜關(guān)聯(lián)SQL的優(yōu)化

  • 首先查詢返回的結(jié)果集,通常查詢返回的結(jié)果集很少,是有優(yōu)化的空間的。

  • 通過查看執(zhí)行計(jì)劃,查看優(yōu)化器選擇的驅(qū)動表,從執(zhí)行計(jì)劃的rows可以大致反應(yīng)出問題的所在。

  • 搞清各表的關(guān)聯(lián)關(guān)系,查看關(guān)聯(lián)字段是否有合適的索引。

  • 使用straight_join關(guān)鍵詞來強(qiáng)制調(diào)整驅(qū)動表的選擇,對優(yōu)化的想法進(jìn)行驗(yàn)證。

  • 如果條件允許,對復(fù)雜的SQL進(jìn)行拆分。盡可能越簡單越好。

force index

有時優(yōu)化器可能由于統(tǒng)計(jì)信息不準(zhǔn)確等原因,沒有選擇***的執(zhí)行計(jì)劃,可以人為改變mysql的執(zhí)行計(jì)劃,例如:

MySQL優(yōu)化語句執(zhí)行的方法有哪些

count的優(yōu)化

按照效率排序的話,count(字段)

到此,關(guān)于“MySQL優(yōu)化語句執(zhí)行的方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI