Какой запрос лучше - PullRequest
       3

Какой запрос лучше

2 голосов
/ 10 ноября 2010
EXPLAIN EXTENDED SELECT id, name
FROM member
INNER JOIN group_assoc ON ( member.id = group_assoc.member_id
AND group_assoc.group_id =2 ) 
ORDER BY registered DESC 
LIMIT 0 , 1

Выходы:

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  group_assoc ref member_id,group_id  group_id    4   const   3   100.00  Using temporary; Using filesort
1   SIMPLE  member  eq_ref  PRIMARY PRIMARY 4   source_member.group_assoc.member_id 1   100.00   

explain extended SELECT
                        id, name
                    FROM member WHERE
                        id
                    NOT IN (
                        SELECT
                            member_id
                        FROM group_assoc WHERE group_id = 2 
                    )               
                    ORDER BY registered DESC LIMIT 0,1

Выходы:

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   PRIMARY member  ALL NULL    NULL    NULL    NULL    2635    100.00  Using where; Using filesort
2   DEPENDENT SUBQUERY  group_assoc index_subquery  member_id,group_id  member_id   8   func,const  1   100.00  Using index; Using where

В первом запросе, в котором я не уверен, он использует временную таблицу, которая кажется худшей идеей. Но я также вижу, что он использует меньше строк, чем второй запрос ....

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Эти запросы возвращают совершенно разные наборы результатов: первый возвращает членов группы 2, второй возвращает всех, кто не член группы 2.

Если вы имели в виду это:

SELECT  id, name
FROM    member
LEFT JOIN
        group_assoc
ON      member.id = group_assoc.member_id
        AND group_assoc.group_id = 2
WHERE   group_assoc.member_id IS NULL
ORDER BY
        registered DESC 
LIMIT 0, 1

, тогда планы должны быть идентичны.

Вы можете найти эту статью интересной:

Создайте индекс на member.registered, чтобы избавиться от filesort и temporary.

0 голосов
/ 10 ноября 2010

Я бы сказал, что первое лучше. Временная таблица не может быть хорошей идеей, но подзапрос не намного лучше. И вы дадите MySQL больше возможностей для оптимизации плана запросов с внутренним объединением, чем у подзапроса.

Решение подзапроса быстрое, если будет возвращено всего несколько строк.

Но ... первый и второй запросы не похожи друг на друга, так ли это?

...