項目背景:
一個通過微信網(wǎng)頁訪問在線答題的功能 估蹄,目標用戶覆蓋江西全省大中小學生塑煎。
阿里云服務(wù)器性能:
CPU: 2核 內(nèi)存:4 GB 帶寬:3Mbps,環(huán)境: LAMP
已經(jīng)完成的功能:
1. 微信授權(quán)
2. 隨機篩選 30 道題輸出
3. 前端頁面單選的交互
4. 記錄答案提交的數(shù)據(jù)(答對題目臭蚁、時間)
5. 計算在同學校同年級的排名
考慮到的優(yōu)化:
1. 不是每個人都是隨機考題最铁,考慮到參與人數(shù)眾多,題庫也才 50道題垮兑,50抽30冷尉,做相同的考題的幾率還是挺高的,順便就控制在一個時間周期內(nèi)的考題一樣系枪,不重復那數(shù)據(jù)雀哨;所以就第一個用戶訪問獲取到 30 道題后先得到考卷數(shù)據(jù),存入本地文件私爷,5分鐘有效震束,超時重新生成考卷;
2. 靜態(tài)文件都通過cdn服務(wù)訪問
一開始用戶增加上去了当犯,服務(wù)器的Mysql 就%CPU 爆表垢村, 130% 以上都有
第一步優(yōu)化:
1. 高峰人數(shù)要找到同年級的排名比較耗時和沒有太多實際意義,看的人其實可能不多嚎卫,就臨時先取消這個模塊展示嘉栓;
2. Mysql 表增加索引(效果非常顯著)
優(yōu)化前后對比--看中間的高峰
但是好景不長,6日開始拓诸,就Mysql 又爆表了侵佃,想著,該加的索引都加上了奠支,不知道因為什么導致(其實這個時候就算有遺漏也不好發(fā)現(xiàn))
7天內(nèi)的CPU使用率
這個時候Mysql 的慢查詢功能就可以擺上用場了馋辈。
netstat -na|grep -i "80"|wc -l
1562
top 查詢 Mysql 占用最多CPU的資源,那肯定是因為同時在線的用戶查詢可能因為阻塞導致的大堵車倍谜,目前最重要的是要定位出來是什么的語句導致的迈螟。
慢查詢有什么用?
它能記錄下所有執(zhí)行超過long_query_time時間的SQL語句, 幫你找到執(zhí)行慢的SQL, 方便我們對這些SQL進行優(yōu)化.
如何開啟慢查詢?
首先我們先查看MYSQL服務(wù)器的慢查詢狀態(tài)是否開啟.執(zhí)行如下命令:
我們可以看到當前l(fā)og_slow_queries狀態(tài)為OFF, 說明當前并沒有開啟慢查詢.
開啟慢查詢非常簡單, 操作如下:
Linux下找到mysql的配置文件my.ini, 在mysqld下方加入慢查詢的配置語句(注意:一定要在[mysqld]下的下方加入)
log-slow-queries: 代表MYSQL慢查詢的日志存儲目錄, 此目錄文件一定要有寫權(quán)限;Windows下需要寫絕對路徑尔崔,如:log-slow-queries="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log"
long_query_time: 最長執(zhí)行時間. (如圖, MSYQL將記錄下所有執(zhí)行時間超過2s的SQL語句, 此處為測試時間, 時間不應(yīng)太小最好在5-10秒之內(nèi), 當然可以根據(jù)自己的標準而定);
配置好以后重新啟動一個MYSQL服務(wù)
然后查看log發(fā)現(xiàn)了問題
SELECT * FROM `fd_members` WHERE `unionid` = 'oh6a0s65Oh8rTtFLoW9Pf0***' LIMIT 1;
都是因為這樣類似的語句記錄答毫,說明這條查詢非常久(表里邊大概有30多萬條記錄),測一下季春,當時候服務(wù)器查詢要13秒左右洗搂,坑爹的,那怪堵車那么嚴重。
然后再看數(shù)據(jù)庫表結(jié)構(gòu)耘拇,原來members 表的uniond 沒有加入索引撵颊,趕快補充上了,然后再測試惫叛,就變成了 10ms 不到就出來了秦驯。這差別是 千倍數(shù)呀!挣棕!
開了后的效果译隘,如下,立竿見影
image.png
晚上統(tǒng)計了一下洛心,今天一共來的人數(shù),在Nginx 的地方還有好多要優(yōu)化的地方
人數(shù)