数据库的查询性能一直是性能优化的重灾区。近期看了丁奇老师的分享“为什么SQL语言使用了索引,但却还是慢查询?”,收获颇丰,以此做个记录
0 准备
创建一张测试表,设置主键索引(id)和普通索引(a) ,如下:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入两行测试数据
insert into t values(1,1,1),(2,2,2);
1 定义慢查询
我们来看一下官网对慢查询的定义
The slow query log consists of SQL statements that take more than
long_query_time
seconds to execute and require at leastmin_examined_row_limit
rows to be examined.
mysql的慢查询与语句的执行时间有关,mysql会将语句的执行时间与系统设置的long_query_time这个参数做对比,如果执行时间time > long_query_time并且扫描的行数超过min_examined_row_limit, 则会被认为是慢查询,并将该语句到慢查询日志中。
查看mysql的long_time_time设置
mysql > show variables like 'long_query_time%';
## 如下所示,慢查询设置的时间为10秒
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
查看慢查询日志的地址
mysql > show variables like '%slow_query_log%';
## slow_query_log 表示慢查询日志是否开启
## slow_query_log_file 表示慢查询日志的地址
+---------------------+-------------------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/ali-186