MySQL-запрос с оптимизацией соединения

У меня вопрос:

SELECT a.nick,grp,count(*) FROM help_mails h JOIN аккаунты ON h.helper = a.id WHERE closed = 1 GROUP BY helper, grp, a.nick

Что не так с этим соединением? Когда я сделал 2 запроса:

SELECT helper,grp,count(*) FROM help_mails h WHERE closed = 1 помощник GROUP BY, grp; ВЫБРАТЬ ник ИЗ аккаунтов ГДЕ id IN (...) Это в 100 раз быстрее.

EXPLAIN возвращает это:

id     select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  h   ref     closed  closed  1   const   1846    Using temporary; Using filesort
1   SIMPLE  a   ref     PRIMARY     PRIMARY     4   margonem.h.helper   1   Using where; Using index

account.id, help_mails.grp и help_mails.closed получили индексы.


person Thinker    schedule 04.06.2009    source источник


Ответы (2)


Обратите внимание, что ваш первый запрос не совпадает со вторым.

Если у вас одинаковые NICK для двух account, COUNT(*) для этих учетных записей будут объединены вместе в первом запросе и возвращены отдельно во втором.

Если вы хотите, чтобы всегда возвращались отдельные COUNT для отдельных account, вы можете объединить свои запросы в один:

SELECT  a.nick, gpr, cnt
FROM    (
        SELECT  helper, grp, COUNT(*) AS cnt
        FROM    help_mails h
        WHERE   closed = 1
        GROUP BY
                helper, grp
        ) ho
JOIN    accounts a
ON      a.id = ho.helper

или измените условие GROUP BY для первого запроса:

SELECT  a.nick, grp, count(*)
FROM    help_mails h
JOIN    accounts a
ON      h.helper = a.id
WHERE   closed = 1
GROUP BY
        helper, grp, a.id, a.nick

Построение составного индекса на help_mails (closed, helper, grp) вам очень поможет, поскольку он будет использоваться в GROUP BY.

person Quassnoi    schedule 04.06.2009
comment
Спасибо :) Первый запрос с внутренним выбором работает как надо :) - person Thinker; 04.06.2009
comment
Мыслитель: сработает еще быстрее, если создать составной индекс :) - person Quassnoi; 04.06.2009

Похоже, что проблема в том, что help_mails.helper не индексируется.

person chaos    schedule 04.06.2009
comment
Добавление индекса в вспомогательное поле ничего не улучшает, я это проверил. - person Thinker; 04.06.2009
comment
Для меня это не имеет никакого смысла, но ладно. Попробуйте составной ключ на закрытом и помощнике. - person chaos; 04.06.2009