索引設(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í)行情況,如下圖所示:

其中:
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含義對照表見下表。

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


對于一個(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)在哪里,等等。