我有一个非常简单的查询,它崩溃了我的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
问题似乎出现在第一行,但我没有得到'范围'部分。
答案 0 :(得分:0)
您可以尝试这样的事情:
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;