携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第43天,点击查看活动详情
1.查看是否开启慢查询日志
show variables like "%slow_query_log%";
2.查看慢查询阈值
show global variables like "long_query_time";
set global long_query_time = 1;
3.确定慢查询日志路径
show global variables like "datadir";
4.确定慢查询日志的文件名
show global variables like "slow_query_log_file";
5.有时慢查询正在执行,已经导致数据库负载偏高了,而由于慢查询还没执行完,因此慢查询日志还看不到任何语句。此时可以使用 show processlist 命令判断正在执行的慢查询。show processlist 显示哪些线程正在运行。如果有 PROCESS 权限,则可以看到所有线程。否则,只能看到当前会话的线程
show processlist
知识扩展:如果不使用 FULL 关键字,在 info 字段中只显示每个语句的前 100 个字符,如果想看语句的全部内容可以使用 full 修饰(show full processlist)
Time:表示执行时间
Info:表示 SQL 语句
我们这里可以通过它的执行时间(Time)来判断是否是慢 SQL
6.实战
CREATE TABLE t1 ( /* 创建表t1 */
id int(11) NOT NULL auto_increment,
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
PRIMARY KEY (id),
KEY idx_a (a),
KEY idx_b (b)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
drop procedure if exists insert_t1; /* 如果存在存储过程insert_t1,则删除 /
delimiter ;;
create procedure insert_t1() / 创建存储过程insert_t1 /
begin
declare i int; / 声明变量i /
set i=1; / 设置i的初始值为1 /
while(i<=1000)do / 对满足i<=1000的值进行while循环 /
insert into t1(a,b) values(i, i); / 写入表t1中a、b两个字段,值都为i当前的值 /
set i=i+1; / 将i加1 /
end while;
end;;
delimiter ; / 创建批量写入1000条数据到表t1的存储过程insert_t1 /
call insert_t1(); / 运行存储过程insert_t1 /
drop table if exists t2; / 如果表t2存在则删除表t2 /
create table t2 like t1; / 创建表t2,表结构与t1一致 /
insert into t2 select * from t1; / 将表t1的数据导入到t2 */
执行查询:
explain select * from t1 where b=100;