MySQL慢查詢
來源:程序員人生 發布時間:2015-01-14 08:50:36 閱讀次數:3178次
慢查詢(slow log)可以幫助我們定位到特定的SQL語句進行SQL語句層面的優化,例如,慢查詢日志會記錄那些履行時間超過給定值得SQL語句,從而定位到問題的所在。
開啟慢查詢
查看MySQL數據庫實例關于慢查詢的參數
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------------+-----------------------------------+
5 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.02 sec)
其中,
slow_query_log便是開啟慢查詢的參數
slow_query_log_file是慢查詢日志文件的路徑
log_query_time是查詢時間的最大值,超過這個時間就會被慢查詢日志記錄。
下面是開始慢查詢,然后將查詢時間最大值設為2秒,履行sleep3秒,查看慢查詢日志的例子
mysql> set global slow_query_log=ON;
Query OK, 0 rows affected (0.03 sec)
mysql> set long_query_time=2;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 2.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
| 0 |
+----------+
1 row in set (3.00 sec)
mysql> system cat /var/lib/mysql/localhost-slow.log
/usr/sbin/mysqld, Version: 5.6.22-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 150102 16:56:54
# User@Host: root[root] @ localhost [] Id: 1
# Query_time: 3.001084 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
use test2;
SET timestamp=1420189014;
select sleep(3);
慢查詢還有1個參數log_queries_not_using_indexes,用來表示每分鐘允許記錄到慢查詢日志的未使用索引的SQL語句的次數,默許為0,表示沒有限制,但是生產環境中,這類語句會大量占據慢查詢日志的大小,給DBA的分析帶來困擾。
除使用日志文件查看慢查詢日志,還可使用表的情勢查看。在數據庫名為mysql的模式下,有1張叫做slow_log的表,可以記錄慢查詢的輸出,只需改變日志的輸出模式log_output,參數log_output是全局的動態的,可以在運行時動態的改變。
mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_output='table';
Query OK, 0 rows affected (0.00 sec)
mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
| 0 |
+----------+
1 row in set (3.00 sec)
指的注意的是slow_log這張表的引擎室CSV,對查詢的效力可能不是很高,但是作為日志的追加插入效力很高。
mysql> show create table slow_logG
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
關于慢查詢的另外1個有用的參數是long_query_io表示將超過指定邏輯IO次數(邏輯IO包括物理IO,表示物理IO和緩沖池讀取次數之和)的SQL語句記錄到慢查詢日志中去。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈