文章目录
一、SQL及索引优化
问题SQL筛查步骤:
-
检查慢查日志是否打开:
// 查询慢查日志是否打开 show variables like 'slow_query_log'; // 开启慢日志 set global slow_query_log=on; // 开启所有执行语句,记录到日志文件,不可轻易打开 set global log_queries_not_using_indexes=on;
-
检查慢日志路径:
// 查询慢查日志存储路径 show variables like '%slow_query_log_file'; // 实时查看日志 非mysql命令,mac系统下如果出现权限问题,请使用sudo tail -f /usr/local/mysql/data/xxx-slow.log
-
慢日志判断标准(默认查询时间大于10s的sql语句)
// 查询慢查日志判断标准时间 show variables like 'long_query_time'; // 设置判断标准时间 set global long_query_time=1;
-
其他命令
// 测试 睡眠12秒 select sleep(12); // 查看创建表语句 show create table xxx // 创建索引 create index idx_id on t1(id); // 查询mysql select @@version
数据演示:
-
数据准备
-
建表3部曲
create database test; use test; create table t1(id int, name varchar(255));
-
使用存储过程,灌入10万条数据
DROP PROCEDURE IF EXISTS pro_t1; delimiter $$ create procedure pro_t1() begin declare i int; set i=0; while i<100000 do insert into t1 (id,name) values(i,CONCAT(‘smartan’,i)); set i=i+1; end while; end $$ delimiter ; call pro_t1();
-
日志检测
- 第一行,SQL查询执行的时间
- 第二行,执行SQL查询的连接信息,用户和连接IP
- 第三行,记录了一些比较有用的信息:
- Query_time:这条SQL执行的时间,越长越慢
- Lock_time:在mysql服务器阶段(不是在存储引擎阶段)等待表锁时间
- Rows_sent:查询返回的行数
- Rows_examined:查询检查的行数,越长越费时间
- 第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间
- 第五行及后面所有行,执行的sql语句记录信息。
-