目錄
序言: 在我面試很多人的過程中,很多人談到sql優化都頭頭是道,建索引,explain分析,like全模糊會導致索引失效 云云,於是我問道:優化之前,需要找出資料庫中比如超過2s的慢sql,你是怎麼找的?很多人答不上來,要是找都找不到,怎麼去優化呢,乙個中大型系統可能成千上萬條sql都不過分,難道要乙個個去分析麼。
所以今天和大家聊聊慢sql的挖掘機-慢查詢日誌
mysql的慢查詢日誌是mysql提供的一種日誌記錄,它用來記錄在mysql中響應時間超過閥值的語句,具體指執行時間超過long_query_time
值的sql,則會被記錄到慢查詢日誌中。
當然,如果不是調優需要的話,一般不建議啟動該引數,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。
開啟了慢查詢日誌後,什麼樣的sql才會記錄到查詢日誌裡面?
這個是由引數long_query_time控制,預設情況下long_query_time的值為10秒
檢視命令:show variables like 'long_query_time%';
注: 永久設定慢查詢日誌開啟,以及設定慢查詢日誌時間臨界點(不建議)
linux中,mysql配置檔案一般預設在 /etc/my.cnf 更改對應引數即可
為什麼設定後看不出變化:
檢視慢查詢日誌:
從慢查詢日誌中,我們可以看到每一條查詢時間高於3s 的sql語句,並可以看到執行的時間是多少。
比如上面,就表示 sql語句 select * from comic where comic_id < 1952000; 執行時間為3.902864秒,超出了我們設定的慢查詢時間臨界點3s,所以被記錄下來了
檢視有多少條慢查詢記錄:show global status like '%slow_queries%';
在生產環境中,如果要手工分析日誌,查詢、分析sql,顯然是個體力活,mysql提供了日誌分析工具 mysqldumpslow
工作常用參考:
得到返回記錄集最多的10個sql:mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log
得到訪問次數最多的10個sql:mysqldumpslow -s c -t 10 /var/lib/mysql/mysql-slow.log
得到按照時間排序的前10條裡面含有左連線的sql:mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql-slow.log
建議: 為方便 可以結合 | 和 more 使用,否則可能出現爆屏
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
mysql優化之sql優化原則
原則一 選擇需要優化的sql 1 選擇更需要優化的sql 高併發 低消耗的sql。例項 a語句 1小時請求1w次,1次10個io b語句 1小時請求10次,1次1w個io 1 從單位時間產生的io總數來說,相同的 2 針對乙個sql,如果我能把10個io變成7個io,一小時減少3w個io 針對第二個...
MySQL之SQL優化 二
建立更好的索引 1.覆蓋索引,當qep在extra列中顯示using index時,不意味訪問底層資料庫時使用了索引,他代表只有這個索引才是足查詢要求的。這種索引可以為大型查詢或者頻繁執行的查詢帶來顯著的效能提公升,稱為覆蓋索引,故名思義,因為他滿足了查詢中給定表用到的所有列。要建立乙個覆蓋索引,他...
MySQL優化(一)常用SQL優化
一 新增 二 刪除 delete from 刪除語句加where條件,如果是刪除全部記錄,使用truncate table 表名,而不使用delete語句。三 修改 四 查詢 索引這裡就不重複了,一般在建表時對常用的查詢欄位就應該加上索引。1 單錶查詢 首先盡量只查詢單錶,可以分解成多次單錶查詢的盡...