MySQL5.6 how to optimize slow query SQL statements -- Introduction to slow logs
Recently, a development team complained that the mysql cluster included in our platform was not good and always reported the "heartbeat Error" of mysql and analyzed the logs they collected, no network problems were found between mysql cluster nodes, but a very interesting phenomenon was found. A large number of slow queries were found in the slow log of mysql, it usually takes more than one second. It is obvious that this time-consuming slow query will affect the system behavior. It is pointed out that this allows the development team to optimize their applications, i'm curious that they don't even know that these things can be analyzed ......
Query is the most common cause of slow database response. Currently, most databases provide performance analysis tools. For example, Oracle will help you find slow statements and provide optimization solutions. In MySQL, You need to enable slow log records for analysis (records can be saved in tables or files. By default, they are saved in files, and our system uses the default method ).
First, let's take a look at what the records in the MySQL slow query log look like:
Time Id Command Argument# Time: 141010 9:33:57# User@Host: root[root] @ localhost [] Id: 1# Query_time: 0.000342 Lock_time: 0.000142 Rows_sent: 3 Rows_examined: 3use test;SET timestamp=1412904837;select * from t;
This log should be well understood. The first one is to record the timestamp, and the second one is to record the user and address information for executing the command, third # record the query execution time, lock time, number of returned rows, and number of scanned rows. Next, record the actually executed SQL statements. You can also use the following command to see the meaning of each field in the cvs storage format.
SHOW CREATE TABLE mysql.slow_log;
Next, let's talk about how to obtain and analyze slow logs.
View MySQL slow Log Parameters
Log on to the started MySQL instance and run the following command:
mysql> show variables like '%slow_query%';+---------------------------+----------------------------------------+| Variable_name | Value |+---------------------------+----------------------------------------+| slow_query_log | OFF || slow_query_log_file | /usr/local/mysql/data/cloudlu-slow.log |+---------------------------+----------------------------------------+
Here we will show you the location where slow logs are stored and whether slow logs are enabled.
So what kind of query needs to be logged? In MySQL,Query without indexAndQueries that exceed the specified number of scanned rows at the same time within the specified timeIt must be recorded in the slow log query.
How can we view their parameters?
Query record switch without index
mysql> show global variables like '%indexes%';+----------------------------------------+-------+| Variable_name | Value |+----------------------------------------+-------+| log_queries_not_using_indexes | OFF || log_throttle_queries_not_using_indexes | 0 |+----------------------------------------+-------+
The first parameter indicates whether to enable query without index. The second parameter is used to control the traffic of log records. The default value 0 indicates no limit.
Query switch that exceeds the specified time length
mysql> show global variables like '%long_query%';+-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.00 sec)
A query with a specified length of time must be recorded.
Scan query switch that exceeds the specified number of rows
mysql> show variables like '%min_examined_row_limit%';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| min_examined_row_limit | 0 |+------------------------+-------+1 row in set (0.00 sec)
The default value is 0, indicating the number of rows not scanned now
Set MySQL slow Log Parameters
Enter MySQL, enter the following command, modify it in the MySQL STARTUP configuration file, or add startup parameters to MySQL. The following changes are made after entering MySQL:
set global long_query_time=0.1;set global log_queries_not_using_indexes=on;set global slow_query_log = on;
There are two points to consider here. First, there is a problem with logs that exceed the specific duration, which is determined by the system requirements. The second is how many logs are recorded per minute without using indexes. To prevent too many logs from affecting performance.