慢查询日志分析问题sql
slow_query_log 启动或者停止慢查询日志
slow_query_log_file 指定慢查询日志的存储路径和文件
long_query_time 指定记录慢查询日志的阈值通常改为0.001秒也就是1毫秒
long_queries_not_using_indexs 是否记录未使用索引的sql
常用的慢查询日志分析工具
mysqldumpslow
pt-query-digest
实时获取问题sql
select id,user,host,DB,command,time,state,info from
information_schema.PROCESSLIST where TIME>60
SQL的解析预处理以及执行计划
- 客户端发送sql请求给服务器
- 服务器检查是否可以在查询缓存中命中该sql
查询缓存对性能的影响(读写频繁可以关闭)
query_cache_type 设置查询缓存是否可用
query_cache_size 设置查询缓存的内存大小
query_cache_limit 设置查询缓存可用存储的最大值
query_cache_wlock_invalidate 数据表被锁后是否返回缓存中的数据
query_cache_min_res_unit 设置查询缓存分配的内存块最小单位
- 服务器执行sql解析,预处理,再由优化器生成对应的执行计划
- 根据执行计划调用存储引擎API来查询数据
- 将结果返回给客户端
如何确定查询处理各个阶段所消耗的时间?
使用profile //session 级别
set profiling = 1;
执行查询
show profiles //查看每一个查询所消耗的总时间的信息
show profile for query N //查询每个阶段所消耗的时间 N是上过命令的id
使用performance_schema //全局级别
如何优化特定的sql?
如何修改大表的结构
pt-online-schema-change //可以参考这个https://blog.csdn.net/yangshangwei/article/details/104152835