mysql - 为什么我的 MySQL 服务器会因此查询而崩溃?

标签 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   

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

最佳答案

你可以尝试这样的事情:

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/

相关文章:

php如何在选择下拉列表中显示类别然后显示子类别?

mysql - 如何通过 C 连接到 SQL?

php - 如何在编辑表单中填充组合框

MYSQL GROUP BY 使用全文搜索不返回任何结果

sql - Hive - 对多个替换条件使用替换或 regexp_replace 函数

c# - LINQ to SQL 没有得到正确的数据

MYSQL - 将 MYSQL Workbench 连接到本地主机上的 MYSQL 服务器

mysql - 在这个表示住宿服务房价的 SQL 表中设置键的最佳解决方案是什么?

mysql - 使用 SQL 设置表中的列以匹配另一个表中的最高上下文值

python - 使用 Python 在 SQL 查询(嵌套 Select 语句)中进行算术运算