我的应用程序中的哪些文件使 Mysql 查询日志条目变慢

Posted

技术标签:

【中文标题】我的应用程序中的哪些文件使 Mysql 查询日志条目变慢【英文标题】:Which Files In My Application that Make Slow Mysql Query Log Entries 【发布时间】:2019-06-01 12:28:59 【问题描述】:

我已经为这个问题苦苦挣扎了 2 天,但没有找到解决方案。

我以 10 秒的周期记录 mysql 慢查询。在日志文件中有一个巨大的条目与此语句:

# Thread_id: 222244  Schema: user  QC_hit: No
# Query_time: 51.019708  Lock_time: 0.000119  Rows_sent: 1  Rows_examined: 13295012
# Rows_affected: 0
SET timestamp=1559388099;
SELECT (COUNT(*)) AS `count` 
FROM statistics Statistics WHERE (id >= 1 AND ad_type <> 3);

这与 apache 请求的激增有关。 query_time 最多完成一分钟或更长时间,并导致我的服务器超载。 问题是我在我的 php 脚本中找不到导致慢查询的文件。

是否有任何命令行来查找相关文件。或者有什么快速的方法?

CREATE TABLE statistics` (
    id bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    ... , 
    PRIMARY KEY (id), 
    KEY idx_uid (uid), 
    KEY idx_ip (ip), 
    KEY idx_cnid_uid (cid,uid), 
    KEY idx_rlid (rid), 
    KEY idx_created_uid (created,uid)
) ENGINE=InnoDB AUTO_INCREMENT=34015 DEFAULT CHARSET=utf8

【问题讨论】:

我试过这条线,还是不行:grep -HIi -rnw "Statistics" './public_html' |剪切 -d: -f1 你为什么将statistics 表别名为Statistics 就我个人而言,我会连接一个适当的 PHP 分析器,然后简单地检查代码中时间花费的位置。但是,如果您想手动搜索,请尝试例如'id &gt;=''ad_type &lt;&gt;'Statstic-&gt;findStatistics-&gt;findStatstic-&gt;find('count'Statstics-&gt;find('count'paginate('Statstic'paginate('Statstics'paginate($this-&gt;Statistic、@ 987654334@... 通常是find('count'-&gt;count(),因为CakePHP 核心在各个地方也会发出计数查询,例如在保存数据时。也可以尝试使用双引号而不是单引号。 并确保您的列被正确索引,这样一个简单的查询不应该花费任何大量时间,即使有数百万行。 请提供SHOW CREATE TABLE statistics 【参考方案1】:

如果没有理由检查id &gt;= 1,请去掉它——它会抑制某些优化。

然后添加INDEX(ad_type)

不过,我认为在 34K 行(?)表上的 COUNT(*) 没有充分的理由花费 51 秒。必须涉及其他事情。

【讨论】:

正如我在问题中提到的,只有当 apache 请求出现峰值时才会发生这种情况。我的mpm prefork &lt;IfModule mpm_prefork_module&gt; StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 512 ServerLimit 512 MaxConnectionsPerChild 5000 &lt;/IfModule&gt; apache config Timeout 30 KeepAlive On MaxKeepAliveRequests 500 KeepAliveTimeout 5 对不起,之前创建的表值来自我的调试数据库,真实数据库显示这个ENGINE=InnoDB AUTO_INCREMENT=13437433 DEFAULT CHARSET=latin1 我希望你能查明我的问题。它更多的是在应用程序本身中发现错误并消除它,而不是优化查询语句。随着每周大约 500 万行新行的增长,它很快就会成为我的大问题。我需要在脚本中找出相关文件。作为临时解决方案,我添加了 ad_type 的索引。 CREATE TABLE `statistics` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ... , PRIMARY KEY (id), ..., KEY idx_created_uid (created,uid), KEY idx_adtype (ad_type)) ENGINE=InnoDB AUTO_INCREMENT=13455056 DEFAULT CHARSET=latin1 多少内存? innodb_buffer_pool_sizemax_connections的设置是什么? uid 是什么数据类型?请详细说明为什么需要运行该计数(*);我的目标是避免运行它,或者找到一种避免在繁忙时间运行它的方法。 这是一个错误!我最终通过搜索所有可能的关键字找到了它。无论如何感谢您的帮助。

以上是关于我的应用程序中的哪些文件使 Mysql 查询日志条目变慢的主要内容,如果未能解决你的问题,请参考以下文章

MySQL都有哪些日志?分别都代表什么?

可以找出哪些 MySQL 查询很慢吗?

面试官:MySQL 中的 3 大日志是指哪些?面试必问

MySQL日志

MySQL:动态开启慢查询日志(Slow Query Log)

mysql 文件