在MySQL中寻找IN运算符的替代方案

时间:2018-05-12 06:13:06

标签: mysql

我有两张桌子

  • Table1包含500,000条主键列标识为
  • 的记录
  • 表2包含3 300 000条记录,其主键列标识为

Table2有重复,并在列ID上编入索引。

我正在尝试执行以下查询

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

如果我在IN运算符条件中将id作为固定值放置

同样

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

我收到错误/警告。

我想知道是否可以使用 IN 运算符来提高查询性能。

1 个答案:

答案 0 :(得分:0)

假设您的第一个查询中有一个类型且其中一个IMyService实际上应该是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'); 为真。如您所见,记录必须与EXISTScondition1='xx'以及condition2='yy'中的id相匹配。如果你想象一下,这样的行也会在你的子查询中使用table2 - 它会返回那个ID,等等,所以这样的记录必须在那里 - 反之亦然,你我会看到它等同于你的IN声明。

如果没有我假设的错字,你根本不需要IN。只需在主查询中提升条件即可。

IN

子查询结果中的ID是满足SELECT field1, field2, field3 FROM table2 WHERE condition1='xx' AND condition2='yy'; condition1='xx'的行的ID。当您使用主查询中的条件时,您将获得这些行。因此,在两个查询中都有完全相同的ID集,这意味着您具有相同的结果集。

要进一步优化此功能,您可以创建索引以支持查询。但是为了给你提示,你必须至少提供实际的表结构,实际的查询和解释计划。