为什么我的MySQL服务器会从此查询中崩溃?

时间:2014-05-27 05:43:59

标签: mysql sql

我有一个非常简单的查询,它崩溃了我的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个函数之一(AVGCOUNT)的情况下运行查询,那么这是有效的。如果我一起运行它们,我的连接就会消失。

我运行的数据集大约是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   

问题似乎出现在第一行,但我没有得到'范围'部分。

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;