Mysql IN关键字

时间:2015-05-11 04:14:05

标签: mysql query-optimization

我正在尝试使用IN关键字编写查询。

表A.   attrId,attrName

表B.   key,attrId,attrVal

根据提供的密钥,我想返回所有attrName,attrVal组合。结果将包含两个表中的列。在尝试练习使用IN关键字时,我不想使用attrId加入。

以下是我尝试的查询:

Select a.attrName, b2.attrVal
from table_A AS a, table_B AS b2
where a.attrId in (Select b1.attrId from Table_B b1 where key = <someKey>)

但是我没有得到任何查询结果。也是使用IN关键字慢的查询,应该避免。我在table_A中有大约500个条目,在table_B中有500k个条目。另一个替代方法是从table_B获取所有attrId,然后为每个检索到的attrId触发多个jdbc查询以获得相应的attrName。 你能帮忙吗? 感谢

1 个答案:

答案 0 :(得分:3)

您的查询正在执行CROSS JOIN操作,从a返回的每一行都是&#34;匹配&#34;来自b的每一行。

您的查询相当于:

SELECT a.attrName
     , b2.attrVal
  FROM table_A a
 CROSS
  JOIN table_B b2
 WHERE a.attrId IN ( <some_list> )

此查询不返回任何行的唯一方法是1)a中没有行满足WHERE子句中的谓词,2)b2不包含任何行,或者3)执行查询生成的行数超过某些可用资源(例如临时空间)并返回错误,或者4)客户端在查询完成之前已超时或取消查询。

我知道您正在尝试编写一个使用IN运算符的查询,但您发布的查询返回的集合确实没有多大意义。

问:是使用IN关键字慢的查询,应该避免使用。

答: IN运算符本身并不一定会使查询变慢。

例如:

SELECT t.id FROM mytable t WHERE t.id = 2 OR t.id = 3 OR t.id = 5

可以使用IN运算符重写为:

SELECT t.id FROM mytable t WHERE t.id IN (2,3,5)

另一方面,使用带有相关子查询的IN运算符的查询可以是&#34;慢&#34;如果1)子查询很慢和/或2)有很多行需要对子查询进行评估。

如果要返回满足某些条件的b行,然后将这些行与a中的行匹配,则应该通过为CROSS JOIN提供一些条件来避免ON操作match(SELECT a.attrName , b.attrVal FROM table_A a JOIN table_B b ON a.attrId = b.attrId WHERE b.key = '<someKey>' 子句中的连接谓词)

例如:

UISearchController
相关问题