代码之家  ›  专栏  ›  技术社区  ›  Ben

哪个查询更好

  •  2
  • Ben  · 技术社区  · 14 年前
    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 回复  |  直到 14 年前
        1
  •  1
  •   Quassnoi    14 年前

    这些查询返回完全不同的结果集:第一个返回组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 .

        2
  •  0
  •   Wolph    14 年前

    只要只返回几行,子查询解决方案就很快。