我有一个非常直接的查询导致我的 MySQL 服务器崩溃。当我运行它时,它失去了与 MySQL 的连接,服务器需要一段时间才能恢复。
出于某种原因,我在中断期间运行 SHOW FULL processlist
时得到了这个:
5 debian-sys-maint localhost Query 0 Opening tables select count(*) into @discard from `information_schema`.`COLUMNS`
我相信那是 MySQL 所做的事情,这与我无关。
我正在运行的查询如下:
SELECT
f.title,
q.title,
AVG(answer) AS average_answer,
COUNT(DISTINCT a.id) AS number_of_answers
FROM
answers a
INNER JOIN forms f
ON f.id = a.form_id
INNER JOIN questions q
ON a.question_id = q.id
WHERE
a.form_id IN (1,2,3)
GROUP BY
f.title,
q.title;
(请注意,我更改了别名和表名,因此请忽略任何拼写错误。)
问题是,如果我在没有 2 个函数(AVG
和 COUNT
)之一的情况下运行查询,这将起作用。如果我同时运行它们,我的连接就会中断。
我运行它所针对的数据集是 ~12.000.000 条记录,但是 WHERE f.id IN(1,2,3)
将集合限制为仅 30 或 40。WHERE-子句很快,如果我运行 SELECT * FROM answers WHERE form_id IN (1,2,3)
,我会在 0.01 秒内得到结果。
为什么这种功能组合会让服务器头晕目眩?
编辑: 这是 EXPLAIN 的输出。虽然很难正确格式化它:
1 SIMPLE f range PRIMARY PRIMARY 4 3 Using where; Using index; Using temporary; Using filesort
1 SIMPLE a ref form_fk,question_fk,fk_answer_quality form_fk 5 f.id 16 Using where
1 SIMPLE q eq_ref PRIMARY PRIMARY 4 a.question_id 1
问题似乎在第一行,但我没有得到“范围”部分。
最佳答案
你可以尝试这样的事情:
SELECT
a.t1,
a.t2,
AVG(a.answer) AS average_answer,
COUNT(DISTINCT a.id) AS number_of_answers
from (
SELECT
f.title as t1,
q.title as t2,
answer,
a.id
FROM
answers a
INNER JOIN forms f
ON f.id = a.form_id
INNER JOIN questions q
ON a.question_id = q.id
WHERE
a.form_id IN (1,2,3)
) a
GROUP BY a.t1, a.t2;
关于mysql - 为什么我的 MySQL 服务器会因此查询而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881832/