我們經常會遇到mysql的效能問題,解決辦法之一是去定位到低效的sql語句。
比較常用便是通過以下兩種方式定位到執行效率較低的sql語句:
注:這裡使用的mysql是5.7版本,以下內容都是基於5.7版本
首先我們應該檢視是否已經開啟了慢查詢日誌:
如上是一開始並沒有開啟慢查詢,所以我們需要去開啟並且配置慢查詢一些引數:
開啟mysql的配置檔案my.ini(linux下為my.cnf)並在[mysqld]下新增如下:
slow_query_log = on
long_query_time=2
slow_query_log_file=\slow.log
上面三條語句意思分別是:
1、開啟慢查詢;
2、將所有執行時間超過long_query_time設定值的sql語句記錄到日誌
3、指定慢查詢日誌位置
log_query_time現如今已經可以精確到微妙級別,也就是現在是以微秒級別記錄資料,但是如果我們把日誌輸出方式記錄到表的話,則慢查詢是只能精確到秒級別的,引數log_output則是定義日誌儲存方式的,當我們定義為log_output='table'時候則會把日誌資訊寫入到mysql.slow_log表中。
這裡需要注意,在預設情況下,有兩類語句型別不會被記錄到慢查詢日誌中:管理語句和不使用索引進行查詢的語句,這裡的管理語句包括alter table,analyze table,check table,create index,drop index,optimize table 和repair table,如果我們需要監控這兩類sql語句,可以分別通過引數--log-slow-admin-statements和log_queries_not_using_indexes來控制。
然後我們在管理員許可權上重啟mysql服務:
為了方便測試,現在有一張表裡面被灌入4千5百萬多條資料,除了主鍵索引之外沒有任何其他索引
我們上面是將閾值設定為2秒,這裡查詢用了54秒多,所以被記錄到慢查詢日誌裡面
以上日誌主要欄位query_time1是查詢耗時;
lock_time:鎖占用時間
row_sent:返回給客戶端記錄數
row_examined:檢查表記錄數
我們可以把慢查詢設定成微妙級別的,只需要將long_quert_time設定為如下形式:
我們上面也已經說了,慢查詢記錄時候有兩類語句是不會記錄進去的,其中乙個是不使用索引的查詢,而如果想要把這個也記錄進去則需要使用到log_queries_not_using_indexes變數了:
set global log_queries_not_using_indexes=1;
而分析慢查詢的工具也有很多,mysql自帶的mysqldumpslow或者是第三方工具pt-query-digest都可以,這裡不去說明他們的使用了。
慢查詢日誌是只有在查詢結束之後才會記錄,但是如果在執行過程中我們可以使用這條命令去定位問題。
id是使用者登入mysql時候,系統分配的connectin_id,可以select connection_id()檢視
user:當前使用者名稱
host:ip+埠
db:正在使用哪乙個資料庫
command:顯示使用者正在執行的操作,一般為sleep,query,connect等
time:顯示上面狀態持續時間
state:顯示當前連線的sql語句狀態
info:顯示當前這條sql語句
sql優化 識別 低效執行 的SQL語句
oracle中有兩個重要的檢視 v sql和v sqlarea。一 v sql中記錄的資訊和autotrace顯示的資訊完全一致。檢視包含如下字段資訊 img 第一次執行乙個查詢 select count from emp 後查詢 v sql檢視可得到 select sql text,executi...
Oracle中獲取最低效的SQL的語句
oracle提供了很多任務具來查詢最低效的sql,但是,本質上就是通過如下sql語句,從相關系統檢視中獲取最低效的sql select rownum as rank,a.from select parsing schema name run user,執行使用者 sql fulltext,sql文字...
mysql 定位程序 Mysql定位問題語句
mysql show full processlist g 2.row id 43803 user root host localhost db null command query time 0 state null info show full processlist 3.row id 4380...