Mysql 性能剖析

Jmeter + prometheus + Grafana + Mysql_exporter 進(jìn)行監(jiān)控。 提示:只是自己學(xué)習(xí)筆記,自己做記錄用,讀者應(yīng)該看不懂。請(qǐng)見諒

學(xué)習(xí)目標(biāo)

  • 學(xué)會(huì)對(duì)Mysql數(shù)據(jù)庫(kù)的my.cnf文件進(jìn)行配置
  • 學(xué)會(huì)使用grafana監(jiān)控服務(wù)器的數(shù)據(jù)庫(kù),監(jiān)控服務(wù)器可能出現(xiàn)的性能瓶頸
  • 當(dāng)遇到性能瓶頸時(shí),學(xué)會(huì)進(jìn)行調(diào)優(yōu)操作

數(shù)據(jù)庫(kù)關(guān)鍵指標(biāo):

  • TPS 美妙事務(wù)數(shù)
  • QPS 每秒查詢量
  • 連接數(shù)
  • 查詢吞吐量
  • 查詢執(zhí)行能力
  • 查詢緩存

登錄數(shù)據(jù)庫(kù),輸入sql

show global status like 'questions';  #數(shù)據(jù)庫(kù)的總計(jì)查詢數(shù)
show global status like 'uptime';  #數(shù)據(jù)庫(kù)的總計(jì)運(yùn)行時(shí)間
每秒事務(wù)數(shù)=數(shù)據(jù)庫(kù)的總計(jì)查詢數(shù) ÷ 數(shù)據(jù)庫(kù)的總計(jì)運(yùn)行時(shí)間

my.cnf文件配置

cd /etc,打開my.cnf 如果沒有這個(gè)文件,就新建一個(gè)
log_output=table  #設(shè)置日志的輸出方式,一種是table,另一種是file
slow_query_log=1  #是否打開慢查詢?nèi)罩?設(shè)置1表示打開,0表示關(guān)閉
#慢查詢,指查詢速度比較慢的語(yǔ)句,當(dāng)數(shù)據(jù)庫(kù)發(fā)現(xiàn)有語(yǔ)句執(zhí)行速度比較慢時(shí),就會(huì)將其記錄到日志中
#slow_query_log_file=/var/log/slow_log   #如果上一行選擇輸出到file中,那么這一行填寫文件的路徑
long_query_time=1  #設(shè)置慢查詢的閾值,一般設(shè)置為1-10秒
log_queries_not_using_indexes=0  #是否記錄未使用索引的情況,1表示打開,0表示關(guān)閉
#索引,INDEX,一張表中如果有索引,可以加快檢索速度
max_connections=512  #最大連接數(shù)
datadir=/var/lib/mysql  #數(shù)據(jù)文件的存放目錄,一般不要改
socket=/var/lib/mysql/mysql.sock  #使用socket時(shí),套接字文件的位置,一般不要改

如果對(duì)配置文件進(jìn)行了修改,需要重啟一下mysql

service mysqld restart
system start mysqld

數(shù)據(jù)庫(kù)調(diào)優(yōu)

#慢查詢語(yǔ)句舉例,這個(gè)不是項(xiàng)目中的語(yǔ)句,只是舉例
select * from sq_orderform;  #這個(gè)語(yǔ)句沒有where條件,在數(shù)據(jù)量較大時(shí),非常容易出現(xiàn)慢查詢

#刪除訂單表SQ_ORDERFROM中的某個(gè)外鍵與索引,此時(shí)再查詢訂單,就有可能出現(xiàn)慢查詢
ALTER TABLE sq_orderform DROP FOREIGN KEY FK9BD986FB1E208F02;  #刪除外鍵
ALTER TABLE sq_orderform DROP INDEX FK9BD986FB1E208F02;  #刪除索引

#當(dāng)GRAFANA監(jiān)控到了慢查詢語(yǔ)句時(shí),可以在navicat中執(zhí)行以下語(yǔ)句
select * from mysql.slow_log order by start_time desc;
#按時(shí)間倒序顯示最近的慢查詢語(yǔ)句
#mysql.slow_log 慢查詢?nèi)罩颈?如果出現(xiàn)了慢查詢,mysql會(huì)將出現(xiàn)慢查詢的語(yǔ)句寫入這個(gè)表中
#慢查詢語(yǔ)句,記錄在sql_text列

#在工作中,將慢查詢的SQL語(yǔ)句發(fā)給開發(fā)處理
#開發(fā)調(diào)查問題后,發(fā)現(xiàn)沒有user_id的索引,那么可以添加一下
ALTER TABLE SQ_ORDERFORM ADD CONSTRAINT FK9BD986FB1E208F02 FOREIGN KEY(USER_ID)
REFERENCES SQ_USER(ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

在navicat中,拿到一個(gè)慢查詢語(yǔ)句,可以嘗試進(jìn)行分析,選中語(yǔ)句,點(diǎn)擊"解釋已選擇的",在下方的解釋1里,找到type的值CONST,EQ_REF,REF,RANGE,INDEX,ALL
執(zhí)行效率CONST > EQ_REF > REF > RANGE > INDEX > ALL

CONST 查詢索引字段,且表中只有一行數(shù)據(jù)
EQ_REF 主鍵或者唯一索引
REF 非唯一索引
RANGE 索引的范圍查詢
INDEX 索引
ALL 全表掃描

image.png

遠(yuǎn)程連接數(shù)據(jù)庫(kù)時(shí)的注意點(diǎn)

#Mysql數(shù)據(jù)庫(kù)初始設(shè)置下,是不可以遠(yuǎn)程訪問的,需要update一個(gè)表
#都市商城服務(wù)器的Mysql不需要設(shè)置
mysql -u root -p
輸入sq  #登錄到數(shù)據(jù)庫(kù)
use mysql  #進(jìn)入mysql庫(kù)
update user set host='%' where user='root';  #允許遠(yuǎn)程訪問數(shù)據(jù)庫(kù)
flush privieleges;  #讓更改立刻生效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容