慢查询
慢查询日志
查看慢查询日志开启情况
show variables like '%slow_query_log%';
开启慢查询日志
命令行启用: set global slow_query_log=1;(开启慢查询日志)
配置启用:
[mysqld]
slow_query_log = 1;
slow_query_log_file = /var/lib/mysql/XXXXXX.log
log_output=FILE #输出格式
慢查询时间
查看慢查询设定时间
show variables like 'long_query_time%';
设置慢查询时间
命令行启用: set global long_query_time=3;
配置启用:
[mysqld]
long_query_time=时间
查看Slow_queries
show global status like '%Slow_queries%'
explain
语法:explian SQL语句
字段 | 解释 | 值 |
---|---|---|
id | 表示SQL执行顺序。 id越大优先级越高,相同按从上到下顺序。 |
NULL、1、2、3... |
select_type | 查询类型。 区别普通查询、子查询、联合查询等的复杂查询。 |
SIMPLE(不包含子查询或者union PRIMARY(子查询中的最外层查询 SUBQUERY(子查询 DERIVED(FROM列表中包含的子查询。 UNION(union的select UNION RESULT(union结果集,id为NULL |
table | 这一行数据是关于哪张表的 | |
type | 数据读取操作的操作类型 | all 全表扫描 index 使用索引,遍历索引树 range 大于等于、in、like都是范围 ref 通过索引匹配多条 eq_ref 通过索引只有一条记录匹配 const 通过索引一次找到 system 表中记录一行记录,特殊const NULL |
possible_keys | 可能用到的索引 | |
key | 实际用到的索引 | |
key_len | 表示索引中使用的字节数 | |
ref | 哪些列、常量被用于索引 | |
rows | 大概有多少行被优化器查询 | |
extra | Using filesort 使用了文件排序 Using temporary 使用了临时表排序 Using index 使用了覆盖索引(Covering Index) Using where 使用了where过滤 Using join buffer 使用了连接缓存 impossible where where的值总是false(name='a' and name ='b') |
Show Profile
分析语句执行的资源消耗情况,用于SQL调优的测量。默认关闭,并保存最近15次的运行结果
查看开启情况: show variables like 'profiling'
开启: set profiling=on;
使用: show profiles;
show profile 类型 for query <show profiles的Query_ID>
类型
type | 解释 |
---|---|
ALL | 显示所有开销信息 |
BLOCK IO | 显示块IO相关开销 |
CONTEXT SWITCHES | 上下文切换相关开销 |
CPU | 显示CPU相关开销信息 |
IPC | 显示发送和接收相关开销信息 |
MEMORY | 显示内存相关开销信息 |
PAGE FAULTS | 显示页面错误相关开销信息 |
SOURCE | 现实和Source_function,Source_file,Source_line相关的开销信息 |
SWAPS | 显示交换次数相关开销的信息 |
需要注意的status
converting HEAP to MyISAM | 查询结果太大,内存都不够用了往磁盘上搬 |
Creating tmp table | 创建临时表 |
Copying to tmp table on disk | 内存中的临时表复制到磁盘 危险!!! |
locked | 锁住 |
mysqldumpslow工具
s 表示按照何种方式排序(后面是c I r t al ar at 等: s r / -s c )
c 访问次数
I 锁定时间
r 返回记录
t 查询时间
al 平均锁定时间
ar 平均返回记录数
at 平均查询时间
t 返回前面多少条的数据
g 正则匹配模式,大小写不敏感
得到返回记录集最多的10个SQL(可以结合管道符使用
mysqldumpslow -s r -t 10 /日志路径 | more
得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /日志路径
得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /日志路径
全局查询日志
不要在生产环境中开启,开启之后,编写的SQL都会被记录到mysql库的general_log表中,可以用 select * fro mysql.general_log 查看。
命令行启用
set global general_log=1;
set global log_output='TABLE'
配置启用
general_log=1
general_log_file=/路径/logfile
log_output=FILE #输出格式