在/etc/my.cnf配置MySQL记录慢查询日志:
[mysqld] slow_query_log=1 long_query_time=0.5 log_queries_not_using_indexes=1
查看慢查询的相关配置:
mysql> show variables like '%slow%';
使用mysqldumpslow分析慢查询日志:
查看该命令的可用选项:
mysqldumpslow -h
找出平均查询时间最长的5条记录:
mysqldumpslow slow_query_log_file -s at -t 5
EXPLAIN
分析
table
: 显示这一行的数据是关于哪张表的
type
: 显示连接是使用了何种类型,从最好到最差的连接类型为:const
(主键查找)、eq_reg
(唯一索引、主键范围查找)、ref
(基于索引查找)、range
(基于索引范围查找)、index
(对索引进行扫描)、all
。
possible_keys
: 该表中可能会使用的索引
key
: 实际使用的索引
key_len
: 索引长度(越短越好)
ref
: 显示索引的哪一列被使用了(如果可能的话,是一个常数)
rows
: MySQL认为需要检查表的数据的行数
extra
: 当该字段出现如下值: 1、Using filesort
; 2、Using temporary
时,表示SQL语句需要优化。数据库表结构优化:
1,使用可以存储下数据的最小数据类型。
2,使用简单的数据类型(尽量使用int
而不是varchar
)。
3,受限于InnoDB的存储特性,尽可能的使用NOT NULL
定义字段。
4,为了提高查询效率,减少查询时需要扫描的范围,尽量少用text
或blob
类型的字段,如果要用,尽量把text
和blob
类型的字段放到单独的表中。表的垂直拆分原则:
1,把不常用的字段单独放到一个表中。
2,把大的字段单独放到一个表中。
3,把经常一起使用的字段放到一个表中。
percona-toolkit: 提供了很多实用的工具
检查重复索引: pt-duplicate-key-checker -uroot -hlocalhost
慢查询分析: pt-query-digest slow_query_log_file
-
innodb_stats_on_metadata
当启用此变量时(这是默认情况,与创建该变量之前相同),InnoDB在元数据语句执行期间更新统计数据,例如SHOW TABLE STATUS或SHOW INDEX,又或者当访问INFORMATION_SCHEMA的表TABLES或STATISTICS时。 (这些更新与ANALYZE TABLE时发生的事情类似。)当禁用时,在这些操作期间InnoDB不会更新统计信息。禁用此变量可以提高有大量的表或索引的架构(schemas) 的访问速度。它也可以提高涉及InnoDB表的查询的执行计划的稳定性。
set global innodb_stats_on_metadata=off;