慢查询和执行计划

10 分钟阅读 451 字 + 1264 词
九、慢查询(了解)
记录了查询比较慢(执行时间长)的SQL的日志。
mysql
mysql> show variables like "%long_query%";  #慢查询日志的时间上限值
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

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            | ON                              |
| slow_query_log_file       | /var/lib/mysql/wangdao-slow.log |
+---------------------------+---------------------------------+
5 rows in set (0.01 sec)

mysql>


set global long_query_time=0.1;#设置慢查询日志的时间上限
set global slow_query_log=on;#打开慢查询日志的开关
十、执行计划(==重要==)
1、命令
命令:== explain + SQL ==
image-20230703114638150
2、每列的含义
image-20230703114735883
3、id列
可以根据id的大小,确定那个表先被访问。
id相同 的时候,按照从上到下的顺序执行;当 id不同 的时候,按照i d从大到小的顺序执行 ;当 id既有相同也有不同 的时候,会先按照== id大的先执行 ==,然后 当id相同的时候,按照从上到下执行
4、select_type列
image-20230703143852027
5、type列(==最重要==)
image-20230703150919958
mysql
student	CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `c1` varchar(20) DEFAULT NULL,
  `c2` varchar(20) DEFAULT NULL,
  `c3` varchar(20) DEFAULT NULL,
  `d_time` datetime DEFAULT NULL,
  KEY `id` (`id`) USING BTREE,
  KEY `c1_c2_c3_idx` (`c1`,`c2`,`c3`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
总结:
system 最快:不进行磁盘 IO,在内存中查询。 const :PK 或者 unique 上的等值查询 (where id = 1) eq_ref :PK 或者 unique 上的 join 查询,等值匹配,对于前表的每一行,后表只有一行命中 ref:非唯一索引,等值匹配,可能有多行命中 range:索引上的范围扫描,例如:between、in、> index:索引上的全集扫描,例如:InnoDB 的 count ALL 最慢:全表扫描
6、possible_keys、key、ken_len三列(==重要==)
possible_keys:可能用到的索引。
key:实际用到的索引。
ken_len:索引字段的 最大可能 长度
key_len= n * 字符集(latin1 = 1, gbk = 2, utf8 = 3, utf8mb4 = 4) + varchar(额外占用两个字节) + NULL(额外占用一个字节)
datetime类型在5.6中字段长度是5个字节,datetime类型在5.5中字段长度是8个字节
7、extra列(==重要==)
image-20230703164752846