主要從一下兩點去優(yōu)化
- explain mysql(mysql語句解釋)
- slow query log(慢查詢?nèi)罩荆?/li>
explain mysql
結(jié)果集中重要性比較高的幾個關(guān)鍵字
1.select_type
select類型赶熟,它有以下幾種值
1.1simple 它表示簡單的select,沒有union和子查詢
1.2 primary 最外面的select,在有子查詢的語句中宛畦,最外面的select查詢就是primary,上圖中就是這樣
1.3 union union語句的第二個或者說是后面那一個.現(xiàn)執(zhí)行一條語句心傀,explain select * from uchome_space limit 10 union select * from uchome_space limit 10,10
2.type
連接類型丽涩。有多個參數(shù)蜈七,先從最佳類型到最差類型介紹 重要且困難,最好到最差的連接類型為const藻懒、eq_reg转培、ref唾糯、range诚啃、index和ALL.
2.1 system
表僅有一行淮摔,這是const類型的特列,平時不會出現(xiàn)始赎,這個也可以忽略不計
2.2 const
表最多有一個匹配行噩咪,const用于比較primary key 或者unique索引。因為只匹配一行數(shù)據(jù)极阅,所以很快
記住一定是用到primary key 或者unique胃碾,并且只檢索出兩條數(shù)據(jù)的 情況下才會是const,看下面這條語句
explain SELECT * FROM `asj_admin_log` limit 1
,
結(jié)果是
雖然只搜索一條數(shù)據(jù),但是因為沒有用到指定的索引筋搏,所以不會使用const.繼續(xù)看下面這個
explain SELECT * FROM `asj_admin_log` where log_id = 111
log_id是主鍵仆百,所以使用了const。所以說可以理解為const是最優(yōu)化的奔脐。
2.3 eq_ref
對于每個來自于前面的表的行組合俄周,從該表中讀取一行。這可能是最好的聯(lián)接類型髓迎,除了const類型峦朗。它用在一個索引的所有部分被聯(lián)接使用并且索引是UNIQUE或PRIMARY KEY。
2.4 ref
對于每個來自于前面的表的行組合排龄,所有有匹配索引值的行將從這張表中讀取波势。如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY KEY(換句話說,如果聯(lián)接不能基于關(guān)鍵字選擇單個行的話)尺铣,則使用ref拴曲。如果使用的鍵僅僅匹配少量行,該聯(lián)接類型是不錯的凛忿。
2.5 index
該聯(lián)接類型與ALL相同澈灼,除了只有索引樹被掃描。這通常比ALL快店溢,因為索引文件通常比數(shù)據(jù)文件小叁熔。
當(dāng)查詢只使用作為單索引一部分的列時,MySQL可以使用該聯(lián)接類型床牧。
2.6 all
對于每個來自于先前的表的行組合者疤,進行完整的表掃描。如果表是第一個沒標記const的表叠赦,這通常不好驹马,并且通常在它情況下很差。通吵悖可以增加更多的索引而不要使用ALL糯累,使得行能基于前面的表中的常數(shù)值或列值被檢索出。
...
** 3.keys **
MYSQL使用的索引册踩,簡單且重要
** 4.rows **
顯示MYSQL執(zhí)行查詢的行數(shù)泳姐,簡單且重要,數(shù)值越大越不好暂吉,說明沒有用好索引
slow query log (慢查詢?nèi)罩?
slow_query_log :是否開啟慢查詢?nèi)罩荆?表示開啟胖秒,0表示關(guān)閉。
log-slow-queries :舊版(5.6以下版本)MySQL數(shù)據(jù)庫慢查詢?nèi)罩敬鎯β窂侥降摹阎肝?梢圆辉O(shè)置該參數(shù),系統(tǒng)則會默認給一個缺省的文件host_name-slow.log
slow-query-log-file:新版(5.6及以上版本)MySQL數(shù)據(jù)庫慢查詢?nèi)罩敬鎯β窂桨菇帧风题?梢圆辉O(shè)置該參數(shù),系統(tǒng)則會默認給一個缺省的文件host_name-slow.log
long_query_time :慢查詢閾值嫉父,當(dāng)查詢時間多于設(shè)定的閾值時沛硅,記錄日志。
log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢?nèi)罩局校蛇x項)
修改my.cnf文件绕辖,增加或修改參數(shù)slow_query_log 和slow_query_log_file后摇肌,然后重啟MySQL服務(wù)器,如下所示
slow_query_log =1
slow_query_log_file=/tmp/mysql_slow.log
日志分析工具 ** mysqldumpslow **
在生產(chǎn)環(huán)境中仪际,如果要手工分析日志围小,查找昵骤、分析SQL,顯然是個體力活吩抓,MySQL提供了日志分析工具mysqldumpslow。
-t, 是top n的意思赴恨,即為返回前面多少條的數(shù)據(jù)疹娶;
-g, 后邊可以寫一個正則匹配模式,大小寫不敏感的伦连;
比如
得到返回記錄集最多的10個SQL雨饺。
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
得到訪問次數(shù)最多的10個SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
得到按照時間排序的前10條里面含有左連接的查詢語句。
mysqldumpslow -s t -t 10 -g "left join" /database/mysql/mysql06_slow.log
另外建議在使用這些命令時結(jié)合 | 和more 使用 惑淳,否則有可能出現(xiàn)刷屏的情況额港。
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more