掘金日新计划 · 8 月更文挑战第43天--mysql执行效率

50 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;