慢查询日志(前面a_53_0的性能分析里学过,这里也没什么变化,当复习就好) 当某条SQL语句的执行时间超过我们指定的时间,就称这条语句为慢查询语句,该语句就会被记录在慢查询日志,方便我 们后续对这条语句进行优化
慢查询日志记录了所以执行时间超过参数long_query_time设置值,并且扫描记录数不小于min_examined_row_limit的 所有的SQL语句的日志,默认未开启。long_query_time默认为10秒,最小为0,精度可以到微秒
long_query_time默认是10秒,当某条SQL语句的执行时间超过10秒就会被记录到慢查询日志。这个10秒是可以修改的, 我们需要去该mysql的配置文件,如下
#编辑my.cnf配置文件
vim /etc/my.cnf
把下面的4行复制粘贴到上面my.cnf的末尾行,并保存退出
#开启慢查询日志
slow_query_log=1
#修改最大执行时间的参数,例如超过2秒就算慢查询
long_query_time=2
重启mysql服务
systemctl restart mysqld
需要导入前面导过很多次的200万数据表,分两步导入,先导入表结构,再导入表数据
【表结构】
CREATE TABLE `tb_sku` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
`sn` varchar(100) NOT NULL COMMENT '商品条码',
`name` varchar(200) NOT NULL COMMENT 'SKU名称',
`price` int(20) NOT NULL COMMENT '价格(分)',
`num` int(10) NOT NULL COMMENT '库存数量',
`alert_num` int(11) DEFAULT NULL COMMENT '库存预警数量',
`image` varchar(200) DEFAULT NULL COMMENT '商品图片',
`images` varchar(2000) DEFAULT NULL COMMENT '商品图片列表',
`weight` int(11) DEFAULT NULL COMMENT '重量(克)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`category_name` varchar(200) DEFAULT NULL COMMENT '类目名称',
`brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称',
`spec` varchar(200) DEFAULT NULL COMMENT '规格',
`sale_num` int(11) DEFAULT '0' COMMENT '销量',
`comment_num` int(11) DEFAULT '0' COMMENT '评论数',
`status` char(1) DEFAULT '1' COMMENT '商品状态 1-正常,2-下架,3-删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
【表数据】
mysql --local-infile=1 -u root -p
set global local_infile=1;
load data local infile '/root/200wdata/tb_sku.sql' into table `tb_sku` fields terminated by ',' lines terminated by '\n';
【验证操作】
准备好200万数据的tb_sku表后,就有了慢查询的环境啦,看查询语句会不会被记录到慢查询日志
#查看'慢查询日志'文件,找一下有没有localhost-slow.log文件
cd /var/lib/mysql && ll;
#新开一个会话,方便实时查看'查询日志'文件尾部的内容,-f参数表示实时刷新,tail表示查看文件的尾部内容
tail -f localhost-slow.log
select * from tb_sku limit 0,10; #查看前十条[1~10]的数据。不会被记录,原因:执行速度<2秒
select * from tb_sku limit 1000000,10; #查看100万后面的10条数据[1000001~10]的数据。会被记录,原因:执行速度>=2秒
localhost-slow.log慢查询日志文件里记录了什么信息 什么时间点、哪个用户、哪个主机、执行了什么SQL语句、执行耗时
下面的也是慢查询日志的笔记,是前面没有讲过的,认真学
默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。解决如下
#修改MySQL的配置文件 /etc/my.cnf 文件
vim /etc/my.cnf
#把下面那四行行粘贴到my.cnf文件里面的末尾行,然后保存退出,表示开启查询日志。0代表关闭,1代表开启
#记录执行较慢的管理语句
log_slow_admin_statements=1
#记录执行较慢的未使用索引的语句
log_queries_not_using_indexes=1
如果你不想你的慢查询日志太乱,那么建议还是把上面两个1改为0,等什么时候有业务需求的时候,再设置为1
重启mysql服务
systemctl restart mysqld
现在你的慢查询日志就非常强大了,只要是查询效率比较低,耗费时间>2秒的,都会被记录
删除tb_sku表
drop table if exists tb_sku;