【问题标题】:Select ... where foo_id in (select id from ...) Efficiency [closed]Select ... where foo_id in (select id from ...) 效率 [关闭]
【发布时间】:2011-12-02 16:04:00
【问题描述】:

i) 在这两者之间,哪一个更有效:

Select A.* from A, B where A.b_id = B.id

Select A.* from A where A.b_id in (select id from B);

ii) Select A.* from A where A.b_id in (select id from B); 是如何工作的?它是在内部翻译成Select A.* from A, B where A.b_id = B.id 之类的,还是针对A 的每一行评估(select id from B)

【问题讨论】:

  • 为什么不对这两个语句运行EXPLAIN ...?这将使您很好地了解它们将如何执行。

标签: mysql sql performance join select-query


【解决方案1】:
【解决方案2】:

这个效率更高:

Select A.* from A, B where A.b_id = B.id

是的,Select A.* from A where A.b_id in (select id from B) 有效。

而且,不,(select id from B) 不会针对每一行进行评估。它只评估一次。

通常,JOINS 比使用 IN 运算符更快。

【讨论】:

  • @seminoobish 请检查我的答案更新
  • Thanks.Does.Does it translate to Select A.* from A where A.b_id in (1,2,3,4..) [Where 1,2,3,4... are B .id(s) 匹配条件] 并且同样有效?
  • 学习机会:您应该在两个命令上运行EXPLAIN。这将使您对如何执行它们有一个很好的了解。
【解决方案3】:

我不确定这些虚假连接从何而来,但您应该使用ON 连接表,而不是最后的大量 WHERE。

SELECT A.*
FROM A
INNER JOIN B ON (A.b_id = B.id)

【讨论】:

  • 这是一种早于 JOIN ON 表示法的表示法。不幸的是,许多 Oracle 书籍和其他资源仍然教授它。它很笨拙(尤其是当您开始使用外连接时),并且大多数人认为这是不好的做法。但不是所有人。真可惜。
【解决方案4】:

这取决于各种因素,包括 MySQL 版本、表的大小、索引的存在等。

您应该尝试执行EXPLAIN ...,如果支持则更好,EXPLAIN EXTENDED ... 后跟SHOW WARNIGS; 以尝试了解 MySQL 正在做什么。

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多