【问题标题】:Which Files In My Application that Make Slow Mysql Query Log Entries我的应用程序中的哪些文件使 Mysql 查询日志条目变慢
【发布时间】: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

标签: php mysql cakephp mariadb mysql-slow-query-log


【解决方案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 是什么数据类型?请详细说明为什么需要运行该计数(*);我的目标是避免运行它,或者找到一种避免在繁忙时间运行它的方法。
  • 这是一个错误!我最终通过搜索所有可能的关键字找到了它。无论如何感谢您的帮助。
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多