Mysql IN 关键字

标签 mysql query-optimization

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

表A 属性标识、属性名称

表B key 、属性标识、属性值

根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。我不想使用 attrId 连接,因为我正在尝试练习 IN 关键字的用法。

下面是我尝试过的查询:

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。 你能帮忙吗? 谢谢

最佳答案

您的查询正在执行 CROSS JOIN 操作,从 a 返回的每一行都与从 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)

另一方面,如果 1) 子查询很慢和/或 2) 有很多行需要必须评估子查询。


如果你想从 b 返回满足某些条件的行,然后将它们与 a 中的行匹配,你应该避免 CROSS JOIN 操作,通过为匹配提供一些条件(ON 子句中的连接谓词)

例如:

SELECT a.attrName
     , b.attrVal
  FROM table_A a
  JOIN table_B b
    ON a.attrId = b.attrId
 WHERE b.key = '<someKey>'

关于Mysql IN 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159570/

相关文章:

MYSQL:从一个用户组中选择用户并从另一个组中排除用户 - 优化

php - mysql innodb db varbinary 的正确索引类型是什么?

sql-server - 针对 View 加入 : performance issues

php - 如何将mysql改为mysqli?

php - 如何从数据库导出值并回显所有由 <hr/> 分隔的值(第一个和最后一个结果除外)?

php - 如何使用php取消设置具有空值的数组?

php - 超过 600 个连接的 MySQL

php - 简单的 HTML dom 抓取价格并将其保存到 MySQL 表

mysql - MySQL建表时有两个主键

mysql - MySql 索引表中固定的 preprendet 字符串是否会导致性能问题?