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

NOT IN查询太慢,行数太多

  •  0
  • methuselah  · 技术社区  · 4 年前

    我下面的SQL查询一直很好,直到thirdparty_token_airdrops最终有20万行,thirdparty_token_holders有90万行。在这种规模下,优化它的最佳方式是什么?

    select id, owner
    from thirdparty_token_holders
    where id not in (
        select holder_id
        from thirdparty_token_airdrops
        where status=1
    )
    and amount > 10000000000
    limit 300
    

    在索引方面,我创建了以下内容:

    CREATE UNIQUE INDEX holder_id on thirdparty_token_airdrops (id, holder_id);
    
    CREATE UNIQUE INDEX owner_address on thirdparty_token_holders (owner, address);
    
    CREATE UNIQUE INDEX owner_id on thirdparty_token_holders (owner, id);
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   methuselah    4 年前

    我通过将查询更改为以下内容来修复它:

    SELECT a.id, a.owner
    FROM thirdparty_token_holders a
    LEFT JOIN thirdparty_token_airdrops b
    ON a.id = b.holder_id
    AND b.status IS NULL
    and amount > 10000000000
    limit 300
    
        2
  •  -1
  •   Backstreet Imrul    4 年前

    你可以试试NOT EXISTS。这也比LEFT jOIN好。因为左联接获取左表的所有可能记录,而不存在的联接首先只获取匹配的行。

    SELECT a.id, a.owner
    FROM thirdparty_token_holders AS a
    WHERE NOT EXISTS 
    (
        SELECT * FROM thirdparty_token_airdrops AS b
        WHERE a.id = b.holder_id
    )
    AND b.status IS NULL
    and a.amount > 10000000000
    limit 300
    ;