我們可以通過Mysql自帶的一些工具來進行簡單的分析一些任務的性能滤港。
前言
在使用Mysql的過程中,可能會遇到一些性能問題趴拧,整體性能突然變差了或者某個查詢語句執(zhí)行速度很慢溅漾,這時候可能就需要我們?nèi)フ{(diào)查下,由于什么原因引起的著榴。
搭建測試環(huán)境
準備數(shù)據(jù)
我們先用sysbench創(chuàng)建一張有100W條記錄的表
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root prepare
表結(jié)構(gòu)和部分表數(shù)據(jù)
表結(jié)構(gòu)
表數(shù)據(jù)
Mysql自帶的一些查詢工具
Mysql自帶了一些工具添履,可以用來測量任務的執(zhí)行性能,下面會簡單的介紹一些工具的用法脑又。
單條查詢性能調(diào)查-SHOW PROFILE
1.我們可以在mysql通過下面的命令暮胧,將profile功能打開
set profiling =1;
2.然后執(zhí)行相應的一些操作,這些記錄的一些數(shù)據(jù)就會記錄到一張臨時表中问麸,例如我們執(zhí)行下面的語句:
select pad from sbtest where pad like 'rrrr';
select pad from sbtest where pad like 'rrrr' limit 0,10;
3.不同的查詢有會不同的queryId和查詢時間往衷,我們可以用過下面語句進行查看
show profiles;
4.使用show profiles獲得數(shù)據(jù)比較簡單,我們還可以對單條查詢進行剖析
show profile for query 1;
5.show profile語句無法根據(jù)時間進行排序严卖,我們可以通過下面的語句進行排序席舍,這樣就能比較方便查看時間主要消耗哪里
set @query_id=1;
select
state,
sum(duration) as total_r,
round(100 * sum(duration) / (select sum(duration) from information_schema.profiling where query_id=@query_id),2) as pct_r,
count(*) as calls,
sum(duration) / count(*) as "r/call"
from information_schema.profiling
where query_id=@query_id
group by state
order by total_r desc;
通過explain獲取sql語句執(zhí)行的一些關(guān)鍵信息,例如是否有用到索引,涉及行數(shù)等
分別執(zhí)行下面兩條語句
explain select * from sbtest limit 0, 10;
explain select * from sbtest where id=100;
通過上圖哮笆,我們清楚兩條語句来颤,一條有用到索引并且涉及行數(shù)為1,另一條沒有用到索引疟呐,并且?guī)缀跎婕叭頂?shù)據(jù)
查看服務器狀態(tài)
show global status
通過show global status我們可以看到當前服務器的狀態(tài)脚曾,例如連接線程數(shù)量,正在運行的線程數(shù)
查看服務器線程狀態(tài)
show processlist
通過show processlist我們可以看到當前所有線程的狀態(tài)启具,通過狀態(tài)值本讥,我們可以當前線程是否有異常
慢查詢?nèi)罩?/h2>
我們可以通過慢查詢?nèi)罩荆瑏聿榭匆恍┞樵兊男畔ⅲ覀円部梢酝ㄟ^將慢查詢的時間設置為0拷沸,來獲取所有的查詢的信息
查看慢查詢?nèi)罩镜氖欠翊蜷_以及日志文件位置
show variables like 'slow_query%';
打開慢查詢?nèi)罩?/h3>
set global slow_query_log='ON';
設置慢查詢時間
set long_query_time=0;
查看慢查詢?nèi)罩?/h3>
set global slow_query_log='ON';
set long_query_time=0;
我們可以直接打開慢查詢?nèi)罩疚募聿榭聪鄳男畔?/p>
結(jié)尾
這些工具都是Mysql自帶的色查,所以當出現(xiàn)問題的時候,可以直接使用撞芍⊙砹耍基于這些工具我們也可以開發(fā)出其他功能更加豐富工具,來對數(shù)據(jù)庫進行實時監(jiān)控以及報警序无。