【发布时间】:2015-07-19 09:39:50
【问题描述】:
我有一个每小时运行的任务,现在已经运行了几个月。该过程从 MySQL (MariaDB) 获取分析并聚合数据。通常需要 1-5 分钟才能完成。
但是,从 13 小时前开始,现在突然需要 26 分钟。我重新启动了 MySQL 服务器,没有任何改变。进程列表显示聚合需要很长时间(有些查询需要 500 秒才能完成,而过去不到 30 秒)。
我要查询的表有 2600 万行。
是什么导致了处理时间的突然跳跃?好久没用了!
你建议我现在做什么?数据库是否已损坏?
查询:
*************************** 2. row ***************************
Id: 76042556
User: -----
Host: --------
db: mydb
Command: Query
Time: 456
State: Sending data
Info: SELECT avg(analytics.event) AS `avg_session`, count(*) AS `count` FROM `analytics` WHERE `analytics`.`app_id` = '436' AND `analytics`.`event_type` = 'session' AND `analytics`.`created_at` >= '2015-06-19 12:16:41' AND `analytics`.`created_at` <= '2015-07-19 12:16:41' ORDER BY `analytics`.`id` ASC
Progress: 0.000
解释:
EXPLAIN EXTENDED SELECT `analytics`.`event` AS `event`, `analytics`.`created_at` AS `a_created_at`, EXTRACT(DAY FROM analytics.created_at) AS `interval`, count(analytics.id) AS `count` FROM `analytics` WHERE `analytics`.`app_id` = '436' AND `analytics`.`event_type` = 'startup' AND `analytics`.`created_at` >= '2015-06-21 09:32:41' AND `analytics`.`created_at` <= '2015-07-21 09:32:41' GROUP BY `interval` ORDER BY `a_created_at` ASC
-> ;
+------+-------------+-----------+------+---------------+--------+---------+-------+----------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+------+-------------+-----------+------+---------------+--------+---------+-------+----------+----------+----------------------------------------------+
| 1 | SIMPLE | analytics | ref | app_id | app_id | 5 | const | 15236882 | 100.00 | Using where; Using temporary; Using filesort |
+------+-------------+-----------+------+---------------+--------+---------+-------+----------+----------+----------------------------------------------+
P.S:请不要告诉我如何减少长查询,而是帮助我理解这个具体问题。
【问题讨论】:
-
您可以在这里发布您的查询吗?
-
查询已添加
-
您的
innodb_buffer_pool_size值是多少?可能是 MariaDB 无法将数据集放入内存中,并且正在使用磁盘来查找它应该聚合的记录——在数据库世界中做某事的时间异常长,几乎总是意味着它们受到 I/O 限制。在机械磁盘的情况下,这意味着您的设置会变得像蜗牛一样慢,以至于手动计算东西几乎更快。一定要验证您的数据是否适合内存,如果可能(而您没有)- 尝试使用 SSD 作为永久存储,而不是机械驱动器。
标签: mysql