項(xiàng)目背景:
一個(gè)通過微信網(wǎng)頁訪問在線答題的功能 ,目標(biāo)用戶覆蓋江西全省大中小學(xué)生。
阿里云服務(wù)器性能:
CPU: 2核 內(nèi)存:4 GB 帶寬:3Mbps,環(huán)境: LAMP
已經(jīng)完成的功能:
1. 微信授權(quán)
2. 隨機(jī)篩選 30 道題輸出
3. 前端頁面單選的交互
4. 記錄答案提交的數(shù)據(jù)(答對(duì)題目、時(shí)間)
5. 計(jì)算在同學(xué)校同年級(jí)的排名
考慮到的優(yōu)化:
1. 不是每個(gè)人都是隨機(jī)考題,考慮到參與人數(shù)眾多,題庫也才 50道題,50抽30,做相同的考題的幾率還是挺高的,順便就控制在一個(gè)時(shí)間周期內(nèi)的考題一樣,不重復(fù)那數(shù)據(jù);所以就第一個(gè)用戶訪問獲取到 30 道題后先得到考卷數(shù)據(jù),存入本地文件,5分鐘有效,超時(shí)重新生成考卷;
2. 靜態(tài)文件都通過cdn服務(wù)訪問
一開始用戶增加上去了,服務(wù)器的Mysql 就%CPU 爆表, 130% 以上都有
第一步優(yōu)化:
1. 高峰人數(shù)要找到同年級(jí)的排名比較耗時(shí)和沒有太多實(shí)際意義,看的人其實(shí)可能不多,就臨時(shí)先取消這個(gè)模塊展示;
2. Mysql 表增加索引(效果非常顯著)

優(yōu)化前后對(duì)比--看中間的高峰
但是好景不長,6日開始,就Mysql 又爆表了,想著,該加的索引都加上了,不知道因?yàn)槭裁磳?dǎo)致(其實(shí)這個(gè)時(shí)候就算有遺漏也不好發(fā)現(xiàn))

7天內(nèi)的CPU使用率
這個(gè)時(shí)候Mysql 的慢查詢功能就可以擺上用場(chǎng)了。
netstat -na|grep -i "80"|wc -l
1562
top 查詢 Mysql 占用最多CPU的資源,那肯定是因?yàn)橥瑫r(shí)在線的用戶查詢可能因?yàn)樽枞麑?dǎo)致的大堵車,目前最重要的是要定位出來是什么的語句導(dǎo)致的。
慢查詢有什么用?
它能記錄下所有執(zhí)行超過long_query_time時(shí)間的SQL語句, 幫你找到執(zhí)行慢的SQL, 方便我們對(duì)這些SQL進(jìn)行優(yōu)化.
如何開啟慢查詢?
首先我們先查看MYSQL服務(wù)器的慢查詢狀態(tài)是否開啟.執(zhí)行如下命令:

我們可以看到當(dāng)前l(fā)og_slow_queries狀態(tài)為OFF, 說明當(dāng)前并沒有開啟慢查詢.
開啟慢查詢非常簡單, 操作如下:
Linux下找到mysql的配置文件my.ini, 在mysqld下方加入慢查詢的配置語句(注意:一定要在[mysqld]下的下方加入)

log-slow-queries: 代表MYSQL慢查詢的日志存儲(chǔ)目錄, 此目錄文件一定要有寫權(quán)限;Windows下需要寫絕對(duì)路徑,如:log-slow-queries="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log"
long_query_time: 最長執(zhí)行時(shí)間. (如圖, MSYQL將記錄下所有執(zhí)行時(shí)間超過2s的SQL語句, 此處為測(cè)試時(shí)間, 時(shí)間不應(yīng)太小最好在5-10秒之內(nèi), 當(dāng)然可以根據(jù)自己的標(biāo)準(zhǔn)而定);
配置好以后重新啟動(dòng)一個(gè)MYSQL服務(wù)
然后查看log發(fā)現(xiàn)了問題
SELECT * FROM `fd_members` WHERE `unionid` = 'oh6a0s65Oh8rTtFLoW9Pf0***' LIMIT 1;
都是因?yàn)檫@樣類似的語句記錄,說明這條查詢非常久(表里邊大概有30多萬條記錄),測(cè)一下,當(dāng)時(shí)候服務(wù)器查詢要13秒左右,坑爹的,那怪堵車那么嚴(yán)重。
然后再看數(shù)據(jù)庫表結(jié)構(gòu),原來members 表的uniond 沒有加入索引,趕快補(bǔ)充上了,然后再測(cè)試,就變成了 10ms 不到就出來了。這差別是 千倍數(shù)呀??!
開了后的效果,如下,立竿見影

image.png
晚上統(tǒng)計(jì)了一下,今天一共來的人數(shù),在Nginx 的地方還有好多要優(yōu)化的地方

人數(shù)