在mysql中寻找in操作符的替代方法

nc1teljy  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(246)

我有两张table
表1包含500000条主键列id为的记录
表2包含300 000条主键列id为的记录
表2有重复项,它在列id上被索引。
我正在尝试执行下面的查询

select 
    field1,
    field2,
    field3
from
    table2
where
    id in (select id from table2 where condition1='xx' and condition2='yy')

如果我在操作符条件中把id作为固定值
同样地

select 
    field1,
    field2,
    field3
from
    table2
where
    id in ('id1','id2','id3','id4'......'idxx')

我收到一个错误/警告。
我想知道是否有任何替代使用in运算符来提高查询性能的方法。

svgewumm

svgewumm1#

假设在第一个查询中有一个类型 table2 我们应该读一读 table1 ,您可以使用 EXISTS 以及相关子查询。

SELECT field1,
       field2,
       field3
       FROM table2
       WHERE EXISTS (SELECT *
                            FROM table1
                            WHERE table1.id = table2.id
                                  AND condition1='xx'
                                  AND condition2='yy');
``` `EXISTS` 如果给定子查询至少存在一条记录,则为true。如您所见,这些记录必须与您的 `condition1='xx'` 以及 `condition2='yy'` 还有 `id` 从 `table2` . 如果您使用picture,那么这样一行也会出现在您的子查询中 `IN` --它会返回那个id,所以这样的记录必须在里面——反之亦然,你会看到,它相当于你的 `IN` 声明。
如果没有我想的那样的打字错误,你就不需要了 `IN` 完全。只需在主查询中向上推条件。

SELECT field1,
field2,
field3
FROM table2
WHERE condition1='xx'
AND condition2='yy';

子查询结果中的id是否满足 `condition1='xx'` 以及 `condition2='yy'` . 当您在主查询中使用条件时,您正好得到这些行。所以两个查询中的id集完全相同,这意味着结果集相同。
为了进一步优化这一点,您可以创建索引来支持查询。但要给您提供这方面的提示,您至少必须提供实际的表结构、实际的查询和解释计划。
iovurdzv

iovurdzv2#

为了提高性能,可以使用内部连接

select a.field1
          ,a.field2
          ,a.field3 
    from table1 a 
    inner join table2 b on a.id = b.id 
          and b.condition1='xx'
             and b.condition2='yy'

并尝试在表2上使用复合索引(condition1,condition2,id)

相关问题