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)維人員的工作:
配置數(shù)據(jù)庫(kù)開(kāi)啟 慢日志功能
配置慢日志的相關(guān)參數(shù),比如存放慢日志的具體位置,還有設(shè)置規(guī)定的時(shí)間
檢查慢日志文件,假如有,把語(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=# |
| 系統(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 TABLE 和 ALTER 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ù)器