慢查询日志介绍
slow_query_log //启动停止记录慢查询日志 show variables like 'slow_query_log'; set global slow_query_log = on;
slow_query_log_file 指定慢查询日志的存储路径及文件
long_query_time 指定记录慢查日志sql执行时间的阀值 // show variables like 'long_query_time';
log_queries_not_using_indexes 是否记录未使用索引的sql

常用的慢查询分析工具(mysqldumpslow)
mysqldumpslow -s r -t 10 slow_mysql.log
-s order (c,t,l,at,al,ar) {c:总次数 t:总时间 l:锁的时间 r:总数据行 at,al,ar平均数 at=总时间/总次数}
-t top 指定前几条作为结束输出

常用的慢查询分析工具pt-query-digest
pt-query-digest --explain h=127.0.0.1,u=root,p=p@1314 slow_mysql.log

实时获取有性能问题的SQL
select ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.PROCESSLIST where TIME > 3;

mysql服务器处理查询请求的整个过程
1.客户端发送sql请求给服务器
2.服务器检查是否可以在查询缓存中命中该sql
3.服务器端进行sql解析,预处理,再由优化器生成对应的执行计划
4.根据执行计划,调用存储引擎api来查询数据
5.将结果返回给客户端

查询缓存对sql性能的影响
query_cache_type 设置查询缓存是否可用 ||demand 表示只有在查询语句中使用sql_cache和sql_no_cache来控制是否需要缓存on 开启off 关闭
query_cahce_size 设置查询缓存的内存大小
query_cache_limit 设置查询缓存可用存储的最大值
query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据
query_cache_min_res_unit 设置查询缓存分配的内存块最小单位

确定查询处理各个阶段所消耗的时间
1.使用profile
set profiling = 1;
执行查询
show profiles;
show profile for query N; //查询每个阶段所消耗的时间
show profile cpu for query 1;

2.使用performance_schema
update setup_instruments set enabled='YES' where name like 'stage%';
update setup_consumers set enabled='YES' where name like 'events%';

如何修改大表的表结构
pt-online-schema-change \
--alter="MODIFY c VARCHAR(150) NOT NULL DEFAULT ''" \
--user=root --password=1314 D=databasename,t=tablename \
--charset=utf8 --exexute