【发布时间】:2017-06-23 09:29:46
【问题描述】:
我有一个不断增长的数据库表,大约有 800 万行正在运行,我的应用程序会定期从中获取数据。但是,查询突然开始锁定整个系统。有大量 mysqld 进程阻塞了所有 CPU 内核。
可能是数据库的大小不断增加吗?或者下面的查询中是否有某些内容可能导致它运行这么长时间?例如UNIX_TIMESTAMP?这是慢查询日志的摘录。查询每分钟执行一次,查询时间始终在 ~7 左右。
# Query_time: 6.839524 Lock_time: 0.000170 Rows_sent: 277 Rows_examined: 7989334
FROM (
SELECT @row := @row + 1 AS `row`, `timestamp`, `price`
FROM (
SELECT @row := 0
) `derived_1`, `items`
WHERE `price` IS NOT NULL
AND `timestamp` >= UNIX_TIMESTAMP(NOW() - INTERVAL 1 DAY)
AND `currency` = 'EUR'
AND `type` = 'icon'
ORDER BY `timestamp` ASC
) `derived_2`
WHERE `row` % 8 = 0;
尝试一下有点困难,因为它是一个生产环境。我也无法在我的开发环境中重现该问题。
如果您需要任何其他信息,请告诉我!
提前致谢!
【问题讨论】:
-
您对 where 子句中的字段是否有索引或表的索引是什么?
-
请发布
EXPLAIN的输出。 -
你能分享一下执行计划吗?
-
我们执行查询时生成的,表示数据传输。
-
@Thierry 这不好,如果您的 where 子句中的字段没有索引,则数据库引擎必须扫描表中的所有条目,显然也是为了排序。因此,随着行数的增加,它会变得越来越慢。
标签: mysql sql cpu mysql-slow-query-log