我的应用程序中的哪些文件使 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 >='
、'ad_type <>'
、Statstic->find
、Statistics->find
、Statstic->find('count'
、Statstics->find('count'
、paginate('Statstic'
、paginate('Statstics'
、paginate($this->Statistic
、@ 987654334@... 通常是find('count'
和->count()
,因为CakePHP 核心在各个地方也会发出计数查询,例如在保存数据时。也可以尝试使用双引号而不是单引号。
并确保您的列被正确索引,这样一个简单的查询不应该花费任何大量时间,即使有数百万行。
请提供SHOW CREATE TABLE statistics
【参考方案1】:
如果没有理由检查id >= 1
,请去掉它——它会抑制某些优化。
然后添加INDEX(ad_type)
不过,我认为在 34K 行(?)表上的 COUNT(*)
没有充分的理由花费 51 秒。必须涉及其他事情。
【讨论】:
正如我在问题中提到的,只有当 apache 请求出现峰值时才会发生这种情况。我的mpm prefork<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 512 ServerLimit 512 MaxConnectionsPerChild 5000 </IfModule>
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_size
和max_connections
的设置是什么? uid
是什么数据类型?请详细说明为什么需要运行该计数(*);我的目标是避免运行它,或者找到一种避免在繁忙时间运行它的方法。
这是一个错误!我最终通过搜索所有可能的关键字找到了它。无论如何感谢您的帮助。以上是关于我的应用程序中的哪些文件使 Mysql 查询日志条目变慢的主要内容,如果未能解决你的问题,请参考以下文章