Q:為什么人家問你MySQL優(yōu)化知識七婴,你總是沒有底氣?
A:因為你只能回答一些大而化之的調(diào)優(yōu)原則察滑。
比如建立聯(lián)合索引(什么樣的聯(lián)合索引打厘?)
分庫分表(用什么樣的策略分庫分表?)
并沒有細(xì)化到定量的層面上去分析贺辰。
如:qps提高了 %N户盯? 有沒有減少文件排序? 查詢語句掃描的行數(shù)是否減少饲化?
MySQL優(yōu)化需要建立在大量的數(shù)據(jù)基礎(chǔ)上莽鸭,我們平時做測試也就手工的往表里添加一些數(shù)據(jù),數(shù)據(jù)量小吃靠,看不出語句之間的明顯區(qū)別蒋川。
Q:如何提高MySQL性能?
A: 需要優(yōu)化撩笆,說明效果不理想捺球。因此我們首先要做的不是優(yōu)化,而是--診斷夕冲。治病的前提是診病氮兵,找出瓶頸所在,CPU歹鱼,內(nèi)存泣栈,IO,峰值,單條語句南片?
- linux下cpu使用率掺涛,內(nèi)存使用率 :使用top命令即可查看。
[root@localhost ~] # top
- iotop可以來查看磁盤讀寫占用情況
[root@localhost ~] # iotop
- MySQL峰值監(jiān)測
這里我們需要找一個小工具幫忙了 疼进,它就是AWK薪缆。
它是一個簡便的直式譯式的文本工具。
擅長處理多行多列數(shù)據(jù)
命令規(guī)則:pattern(條件)+action(動作)
如:awk 'printf{"%s\n",$1}' xx.txt 將打印每一行的第一列
我們將使用 awk 對 對MySQL 的status做一些處理伞广,然后保存到一個文件中拣帽,作為我們的分析依據(jù)。
先看看 MySQL的 status
[root@localhost ~]# mysqladmin -uroot -proot ext
參數(shù)太多啦嚼锄,列不完减拭,我們主要關(guān)注以下幾個參數(shù):
Queries(查詢次數(shù)),Threads_connected(線程連接數(shù))区丑,Threads_running(活躍線程數(shù))
mysqladmin -uroot -proot ext | awk
'/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf(%d %d %d\n,q,c,r)}'
根據(jù)這個命令寫成一個腳本拧粪,每秒鐘執(zhí)行一次。
監(jiān)測一段時間沧侥,根據(jù)生成的數(shù)據(jù)生成報表:
如果波動很大既们,說明可能是緩存失效引起的,此時我們可通過修改緩存策略即可減輕MySQL的壓力正什。
- 語句分析
如果以上情況都正常啥纸,那可能就是我們寫的語句執(zhí)行效率的問題。
可以用show processlist命令長期觀察,或用慢查詢
這個命令是顯示當(dāng)前所有連接的工作狀態(tài)
#!/bin/bash
while true
do
mysql -uroot -e 'show processlist\G'|grep State:|uniq -c|sort -rn
echo '---'
sleep 1
Done
如果觀察到以下狀態(tài),則需要注意
- converting HEAP to MyIsam (查詢結(jié)果太大婴氮,把結(jié)果放到磁盤)
語句寫的不好斯棒,取數(shù)據(jù)太多 - create tmp table (創(chuàng)建臨時表)
如 group時,存儲中間結(jié)果主经,說明索引建的不好 - copy to tmp table on disk(把內(nèi)存臨時表復(fù)制到磁盤)
說明索引建的不好荣暮,表字段選擇不好。 - locked (被其他查詢鎖渍肿ぁ)
一般在使用事務(wù)的地方較容易發(fā)生穗酥。 - logging slow query 記錄慢查詢
explain 與 profilling
這兩個命令是我們分析 sql 最厲的武器,我會在接下來的文章介紹重點介紹惠遏。