Mysql 慢查詢?nèi)罩?/h2>

Mysql 慢查詢?nèi)罩?/h1>

慢查詢?nèi)罩?/h3>

MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來(lái)記錄在MySQL中響應(yīng)時(shí)間超過(guò)閥值的語(yǔ)句,具體指運(yùn)行時(shí)間超過(guò)long_query_time值的SQL,則會(huì)被記錄到慢查詢?nèi)罩局小?/p>

long_query_time的默認(rèn)值為10,意思是運(yùn)行10S以上的語(yǔ)句。該值可以指定為微秒的分辨率。對(duì)于記錄到文件,寫(xiě)入包括微秒部分的時(shí)間。對(duì)于記錄到表,只寫(xiě)入整數(shù)倍; 微秒部分被忽略。

默認(rèn)情況下,不記錄管理語(yǔ)句,也不記錄不使用索引進(jìn)行查找的查詢

默認(rèn)情況下,Mysql數(shù)據(jù)庫(kù)并不啟動(dòng)慢查詢?nèi)罩?,需要我們手?dòng)來(lái)設(shè)置這個(gè)參數(shù),當(dāng)然,如果不是調(diào)優(yōu)需要的話,一般不建議啟動(dòng)該參數(shù),因?yàn)殚_(kāi)啟慢查詢?nèi)罩緯?huì)或多或少帶來(lái)一定的性能影響。

慢查詢?nèi)罩局С謱⑷罩居涗泴?xiě)入文件,也支持將日志記錄寫(xiě)入數(shù)據(jù)庫(kù)表。

寫(xiě)入慢查詢?nèi)罩镜恼Z(yǔ)句中的密碼將由服務(wù)器重寫(xiě),而不是以純文本形式發(fā)生。

常用語(yǔ) SQL 語(yǔ)句的優(yōu)化,運(yùn)維人員的工作:

  1. 配置數(shù)據(jù)庫(kù)開(kāi)啟 慢日志功能

  2. 配置慢日志的相關(guān)參數(shù),比如存放慢日志的具體位置,還有設(shè)置規(guī)定的時(shí)間

  3. 檢查慢日志文件,假如有,把語(yǔ)句和相關(guān)信息給到開(kāi)發(fā)人員或DBA 人員。

配置參數(shù)詳解

是否開(kāi)啟慢日志

屬性
命令行格式 --slow-query-log
系統(tǒng)變量 slow_query_log
范圍 全局
動(dòng)態(tài)
類型 布爾
默認(rèn)值 OFF

設(shè)置slow_query_log為0(或OFF)以禁用日志或設(shè)置為1(或 ON)以啟用它

定義時(shí)間閥值

long_query_time

屬性
命令行格式 --long-query-time=#
系統(tǒng)變量 long_query_time
范圍 全球
動(dòng)態(tài)
類型 數(shù)字
默認(rèn)值 10
最低價(jià)值 0

如果查詢花費(fèi)的時(shí)間超過(guò)此秒數(shù),則服務(wù)器會(huì)遞增Slow_queries 狀態(tài)變量。如果啟用了慢查詢?nèi)罩?,則查詢將記錄到慢查詢?nèi)罩疚募?。此值是?shí)時(shí)測(cè)量的,而不是CPU時(shí)間,因此在負(fù)載較輕的系統(tǒng)上低于閾值的查詢可能會(huì)高于嚴(yán)重負(fù)載的閾值。

設(shè)置慢日志文件名稱

屬性
命令行格式 --slow-query-log-file=file_name
系統(tǒng)變量 slow_query_log_file
范圍 全球
動(dòng)態(tài)
類型 文件名
默認(rèn)值 host_name-slow.log

如果沒(méi)有為慢查詢?nèi)罩疚募付ㄈ魏蚊Q,則默認(rèn)名稱為 host_name-slow.log。除非給出絕對(duì)路徑名以指定其他目錄,否則服務(wù)器將在數(shù)據(jù)目錄中創(chuàng)建該文件。

系統(tǒng)變量 log-queries-not-using-indexes:未使用索引的查詢也被記錄到慢查詢?nèi)罩局校蛇x項(xiàng))。如果調(diào)優(yōu)的話,建議開(kāi)啟這個(gè)選項(xiàng)。另外,開(kāi)啟了這個(gè)參數(shù),其實(shí)使用full index scan的sql也會(huì)被記錄到慢查詢?nèi)罩尽?/p>

系統(tǒng)變量 log_slow_admin_statements 表示是否將慢管理語(yǔ)句例如 ANALYZE TABLEALTER TABLE 等記入慢查詢?nèi)罩?/p>

Mysql 中查看慢查詢的信息

mysql> show variables like 'slow_query%';
+---------------------+---------------------------------------+
| Variable_name       | Value                                 |
+---------------------+---------------------------------------+
| slow_query_log      | OFF                                   |
| slow_query_log_file | /var/lib/mysql/mysql-master1-slow.log |
+---------------------+---------------------------------------+
2 rows in set (0.00 sec)

mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec

Mysql 中配置慢日志

適用于不允許重啟服務(wù)器的情況

mysql> set global long_query_time=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

mysql> show global variables like 'long_query_time%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

另外,如果你想查詢有多少條慢查詢記錄,可以使用系統(tǒng)變量。

mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 0     |
+---------------+-------+
1 row in set (0.01 sec)

開(kāi)始配置

// my.cnf 
[mysqld]
slow_query_log=1
long_query_time=0.5
log_queries_not_using_indexes=ON
slow_query_log_file="/var/log/mysql/mysql_slow.log"

創(chuàng)建對(duì)應(yīng)的目錄并授權(quán)

shell> mkdir /var/log/mysql
shell> chown mysql.mysql /var/log/mysql

處理慢日志的大小

刷新日志時(shí),服務(wù)器會(huì)創(chuàng)建新的二進(jìn)制日志文件。但是,它只是關(guān)閉并重新打開(kāi)常規(guī)和慢速查詢?nèi)罩疚募?/p>

要在Unix上創(chuàng)建新文件,請(qǐng)?jiān)谒⑿轮爸孛?dāng)前日志文件。

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs

您可以通過(guò)禁用日志在運(yùn)行時(shí)重命名常規(guī)查詢?nèi)罩净蚵樵內(nèi)罩荆?/p>

mysql> SET GLOBAL general_log = 'OFF';
mysql> SET GLOBAL slow_query_log = 'OFF';

禁用日志后,在外部重命名日志文件; 例如,從命令行。然后再次啟用日志:

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL slow_query_log = 'ON';

此方法適用于任何平臺(tái),不需要重新啟動(dòng)服務(wù)器

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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