一、什么是數據庫慢查詢?
數據庫慢查詢,就是查詢時間超過了我們設定的時間的語句。
可以查看設定的時間:
默認的設定時間是10秒。也可以自己根據實際項目設定。
set long_query_time=0.0001;
二、MySQL 慢查詢的相關參數解釋:
slow_query_log :是否開啟慢查詢日志,1表示開啟,0表示關閉。
log-slow-queries :舊版(5.6以下版本)MySQL數據庫慢查詢日志存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log
slow-query-log-file:新版(5.6及以上版本)MySQL數據庫慢查詢日志存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log
long_query_time :慢查詢閾值,當查詢時間多於設定的閾值時,記錄日志。
log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢日志中(可選項)。
log_output:日志存儲方式。log_output='FILE'表示將日志存入文件,默認值是'FILE'。log_output='TABLE'表示將日志存入數據庫,這樣日志信息就會被寫入到mysql
慢查詢日志配置:
默認情況下slow_query_log的值為OFF,表示慢查詢日志是禁用的,可以通過設置slow_query_log的值來開啟,如下所示:
show variables like 'slow_query%'; -- 慢查詢
show variables like 'long_query_time'; -- 查詢時間設置
show variables like '%slow_query_log%';-- 查看慢查詢的日志配置
SET GLOBAL slow_query_log = 'ON'; ---開啟慢查詢日志
show variables like 'log_queries_not_using_indexes'; --查看未使用索引的
set global log_queries_not_using_indexes=1; -- 未使用索引的查詢也被記錄到慢查詢日志中
show global status like '%slow_queries%';-- 查詢慢查詢記錄
三、最大連接數的查看與設置
-- 1、查看最大連接數
show variables like '%max_connections%'; -- 上限連接數
SHOW GLOBAL STATUS LIKE 'Max_used_connections' -- 服務響應的最大連接數
比較理想的設置:Max_used_connections / max_connections * 100% ≈ 85%
最大連接數占上限連接數的85%左右,如果發現比例在10%以下,MySQL服務器連接數上限設置的過高了。
-- 2、修改最大連接數
set GLOBAL max_connections = 500;
-- 列出MySQL服務器運行各種狀態值
SHOW GLOBAL STATUS;
四、常見的慢查詢優化
1、索引沒起到作用的情況
1)、使用LIKE關鍵字的查詢語句 在使用LIKE關鍵字進行查詢的查詢語句中,如果匹配字符串的第一個字符為“%”,索引不會起作用。只有“%”不在第一個位置索引才會起作用。
2)、 使用多列索引的查詢語句 MySQL可以為多個字段創建索引。一個索引最多可以包括16個字段。對於多列索引,只有查詢條件使用了這些字段中的第一個字段時,索引才會被使用。
2、優化數據庫結構
1)、將字段很多的表拆解成多個表
2)、設置中間表
3、分解關聯查詢
很多高性能的應用都會對關聯查詢進行分解,就是可以對每一個表進行一次單表查詢,然后將查詢結果在應用程序中進行關聯,很多場景下這樣會更高效。
4、優化limit分頁
在系統中需要分頁的操作通常會使用limit加上偏移量的方法實現,同時加上合適的order by 子句。如果有對應的索引,通常效率會不錯,否則MySQL需要做大量的文件排序操作。
一個非常令人頭疼問題就是當偏移量非常大的時候,例如可能是limit 10000,20這樣的查詢,這是mysql需要查詢10020條然后只返回最后20條,前面的10000條記錄都將被舍棄,這樣的代價很高。
優化此類查詢的一個最簡單的方法是盡可能的使用索引覆蓋掃描,而不是查詢所有的列。然后根據需要做一次關聯操作再返回所需的列。對於偏移量很大的時候這樣做的效率會得到很大提升。