MySQL索引優(yōu)化

索引設(shè)計(jì)使用原則

為了提升數(shù)據(jù)檢索速度,降低查詢延時(shí)和IO消耗,在建表或者編寫SQL語句時(shí),應(yīng)該首先設(shè)計(jì)及檢查索引和數(shù)據(jù)分布情況,下面是常見的索引設(shè)計(jì)或使用原則:

盡量選擇惟一性索引;

為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引;

為常作為查詢條件的字段建立索引;

限制索引的數(shù)目,索引越多,更新和插入的效率越低;

盡量使用數(shù)據(jù)量少的索引;

組合索引中的盡量把能過濾掉更多數(shù)據(jù)的字段放在前面;

盡量使用前綴來索引,針對長文本,TEXT等類型;

刪除不再使用或者很少使用的索引;

數(shù)據(jù)是動(dòng)態(tài)變化中的,索引的使用也需要根據(jù)數(shù)據(jù)的變化而變化。

show processlist 命令

輸入show processlist命令后可以看到數(shù)據(jù)庫中所有連接中的session,以及相應(yīng)SQL的執(zhí)行情況,如下圖所示:


圖片.png

其中:

id是session id,可以使用kill xxxx 的方式來殺死session;

user,host,db是session操作的用戶,主機(jī)和數(shù)據(jù)庫;

command是命令類型;

info是詳細(xì)的SQL語句;

time是相應(yīng)命令執(zhí)行時(shí)間;

state是命令執(zhí)行狀態(tài)。

這里面最重要的是time和state,大部分狀態(tài)對應(yīng)很快的操作,只要有一個(gè)線程保持同一個(gè)狀態(tài)好幾秒鐘,那么可能是有問題發(fā)生了,需要檢查一下。

而根據(jù)state可以判斷執(zhí)行慢的問題在哪里,相應(yīng)state含義對照表見下表。

圖片.png

Explain 命令

在所執(zhí)行的SQL前加explain命令,即可查看相應(yīng)SQL的執(zhí)行計(jì)劃,例如一個(gè)很簡單的like查詢,是否使用了索引,可以通過possible_keys和rows很容易能看出來。

圖片.png

圖片.png

對于一個(gè)復(fù)雜的SQL來說,往往explain會(huì)有多行數(shù)據(jù),相關(guān)列字段見:https://www.cnblogs.com/xiaoboluo768/p/5400990.html

索引設(shè)計(jì)及使用規(guī)范

建表時(shí),就要根據(jù)規(guī)劃中不同表的用途和查詢方式建立合適的索引;

編寫SQL時(shí),要清楚的知道表都有哪些索引,如何才能最大化的利用索引查詢,降低查詢速度,尤其是數(shù)據(jù)量超大(超過100萬條),或者需要進(jìn)行多表關(guān)聯(lián)時(shí),本條規(guī)則就尤其重要;

SQL編寫后,要養(yǎng)成使用explain命令查看索引使用情況的習(xí)慣,避免一些本應(yīng)該使用索引的SQL并沒有使用索引,或者因?yàn)閿?shù)據(jù)問題,使用索引可能還沒有不用來的快;

定時(shí)查看數(shù)據(jù)庫執(zhí)行情況,使用show processlist或者開啟慢查詢,查看慢查詢?nèi)罩荆治鰣?zhí)行效率低的SQL;

當(dāng)發(fā)生數(shù)據(jù)查詢慢,或者數(shù)據(jù)庫IO開銷很高的情況,要學(xué)會(huì)使用show processlist或show full processlist命令查看數(shù)據(jù)庫當(dāng)前在做什么,哪些SQL執(zhí)行慢,問題出現(xiàn)在哪里,等等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容