溫馨提示×

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

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

優(yōu)化mysql sql和sql執(zhí)行計(jì)劃的步驟

發(fā)布時(shí)間:2020-05-22 17:50:42 來(lái)源:網(wǎng)絡(luò) 閱讀:198 作者:三月 欄目:MySQL數(shù)據(jù)庫(kù)

文主要給大家介紹優(yōu)化mysql sql和sql執(zhí)行計(jì)劃的步驟,文章內(nèi)容都是筆者用心摘選和編輯的,具有一定的針對(duì)性,對(duì)大家的參考意義還是比較大的,下面跟筆者一起了解下優(yōu)化mysql sql和sql執(zhí)行計(jì)劃的步驟吧。 

SQL優(yōu)化

禁用SELECT *
使用SELECT COUNT(*) 統(tǒng)計(jì)行數(shù)
盡量少運(yùn)算
盡量避免全表掃描,如果可以,在過(guò)濾列建立索引
盡量避免在WHERE子句對(duì)字段進(jìn)行NULL判斷
盡量避免在WHERE子句使用!= 或者<>
盡量避免在WHERE子句使用OR連接
盡量避免對(duì)字段進(jìn)行表達(dá)式計(jì)算
盡量避免對(duì)字段進(jìn)行函數(shù)操作
盡量避免使用不是復(fù)合索引的前綴列進(jìn)行過(guò)濾連接
盡量少排序,如果可以,建立索引
盡量少JOIN
盡量用JOIN代替子查詢(xún)
盡量避免在WHERE子句中使用IN,NOT IN或者HAVING,使用EXISTS,NOT EXISTS代替
盡量避免兩端模糊匹配 LIKE %***%
盡量用UNION ALL代替UNION
盡量早過(guò)濾
避免類(lèi)型轉(zhuǎn)換
盡量批量INSERT
優(yōu)先優(yōu)化高并發(fā)SQL,而不是頻率低的大SQL
盡可能對(duì)每一條SQL進(jìn)行EXPLAIN
盡可能從全局出發(fā)

sql執(zhí)行計(jì)劃

在mysql命令行中,執(zhí)行explain命令可以看到sql執(zhí)行計(jì)劃


優(yōu)化mysql sql和sql執(zhí)行計(jì)劃的步驟

EXPLAIN列的解釋

table 
   顯示這一行的數(shù)據(jù)是關(guān)于哪張表的。

type

 ALL, index,  range, ref, eq_ref, const, system, NULL

從左到右,性能從最差到最好


ALL:FULL TABLE Scan, MySQL將遍歷全表以找到匹配的行。
INDEX:FULL INDEX Scan,INDEX與ALL區(qū)別為INDEX類(lèi)型只遍歷索引樹(shù)。
RANGE:索引范圍掃描,對(duì)索引的掃描開(kāi)始于某一點(diǎn),返回匹配值域的行,常見(jiàn)于BETWEEN、<、>等的查詢(xún)。
ref:非唯一性索引掃描,返回匹配某個(gè)單獨(dú)值的所有行。常見(jiàn)于使用非唯一索引即唯一索引的非唯一前綴進(jìn)行的查找。
eq_ref:唯一性索引掃描,對(duì)于每個(gè)索引鍵,表中只有一條記錄與之匹配。常見(jiàn)于主鍵或唯一索引掃描
const、system:當(dāng)MySQL對(duì)查詢(xún)某部分進(jìn)行優(yōu)化,并轉(zhuǎn)換為一個(gè)常量時(shí),使用這些類(lèi)型訪問(wèn)。如將主鍵置于WHERE列表中,MySQL就能將該查詢(xún)轉(zhuǎn)換為一個(gè)常量。system是const類(lèi)型的特例,當(dāng)查詢(xún)的表只有一行的情況下, 使用system。
NULL:MySQL在優(yōu)化過(guò)程中分解語(yǔ)句,執(zhí)行時(shí)甚至不用訪問(wèn)表或索引。

possible_keys 
顯示可能應(yīng)用在這張表中的索引。如果為空,沒(méi)有可能的索引??梢詾橄嚓P(guān)的域從WHERE語(yǔ)句中選擇一個(gè)合適的語(yǔ)句。

key 
實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。很少的情況下,MYSQL會(huì)選擇優(yōu)化不足的索引。這種情況下,可以在SELECT語(yǔ)句中使用USE INDEX(indexname)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(indexname)來(lái)強(qiáng)制MYSQL忽略索引。

key_len 
使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好。

ref 
顯示索引的哪一列被使用了,如果可能的話(huà),是一個(gè)常數(shù)。

rows 
MYSQL認(rèn)為必須檢查的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù)。

Extra 
USING INDEX:該值表示相應(yīng)的SELECT操作中使用了覆蓋索引(Covering INDEX)【注:MySQL可以利用索引返回SELECT列表中的字段,而不必根據(jù)索引再次讀取數(shù)據(jù)文件  包含所有滿(mǎn)足查詢(xún)需要的數(shù)據(jù)的索引稱(chēng)為 覆蓋索引】。
USING WHERE:表示MySQL云服務(wù)器在存儲(chǔ)引擎受到記錄后進(jìn)行“后過(guò)濾”(Post-filter),如果查詢(xún)未能使用索引,USING WHERE的作用只是提醒我們MySQL將用WHERE子句來(lái)過(guò)濾結(jié)果集。
USING TEMPORARY:表示MySQL需要使用臨時(shí)表來(lái)存儲(chǔ)結(jié)果集,常見(jiàn)于排序和分組查詢(xún)。
USING filesort:  MySQL中無(wú)法利用索引完成的排序操作稱(chēng)為“文件排序”。

看完以上關(guān)于優(yōu)化mysql sql和sql執(zhí)行計(jì)劃的步驟,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業(yè)知識(shí)信息 ,可以持續(xù)關(guān)注我們的行業(yè)資訊欄目的。

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

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

AI