问题:
在分析慢查询过程中,一个简单查询正常情况下非常快,但有几次非常不合理的执行了很长时间。手动执行也很快,使用EXPLAIN查询执行计划,正确使用
了索引,尝试修改WHERE条件中使用不同值,排查缓存命中的情况,也没有什么问题,这是什么原因?
答:
可能其他东西消耗了资源,比如正在备份,也可能是某种锁或者争用阻塞了查询。
间歇性问题。
DNS查询超时;
memcached缓存过期,导致大量查询落在MySQL以生成新缓存;
互斥锁争用导致或者内部删除查询缓存的算法效率低
并发度超过某个阈值,导致扩展性限制导致查询计划的优化时间过长;
定位问题:
(1)单条查询语句还是服务器问题? (2)是否是周期性问题?
解决技术:
SHOW GLOBAL STATUS 命令捕获数据,通过尖刺或凹陷发现问题,例如(threads_running, threads_conneted,Questions和Queries);
mysqladmin ext -i1 | awk '
/Queries/{q=$4-qp;qp=$4}
/Threas_connected/{tc=$4}
/Threads_running/{printf "%5d %5d %5d\n", q, tc, $4}'
SHOW PROCESSLIST,观察是否有大量线程处于不正常的状况或者有其他不正常的特征。
mysql -e 'SHOW PROCESSLIST\G' | grep State: | sort | uniq -c | sort -rn
使用慢查询日志:
awk '/^# Time:/{print $3, $4, c;c=0}/^# User/{c++}' slow_query.log
pt-collect脚本,搜集统计信息
pt-mysql-summary获取服务器配置信息;