【问题标题】:mysql query with select - where - in - joinmysql 查询与 select - where - in - join
【发布时间】:2009-10-18 21:01:46
【问题描述】:

检索多行的更好方法是什么?

select * 
  from order_details 
 where order_id in (1,2,3, ... .... )

...或:

     select *
      from order_details 
INNER JOIN orders on orders.id = order_details.order_id 
INNER JOIN customers on customers.id = orders.customer_id
     where customers.id = 3

【问题讨论】:

  • 您提供了一个糟糕的示例 - 第一个查询获取基于 ORDER_IDORDER_DETAIL 记录列表;第二个查询正在查找 ORDER_DETAIL 记录,其中 CUSTOMER_ID 是特定值。

标签: sql mysql query-optimization


【解决方案1】:

第一个版本从一个表中选择,所以它要做的工作更少。

但是,如果第二个查询产生正确的答案,那么您必须使用其他两个表来建立 order_id 值列表以生成第一个语句,在这种情况下,总工作量更大,您会总体而言最好使用第二个语句。

一般情况下,让SQL优化器优化;它比你更擅长优化,而且在解决整个问题而不是部分问题时效果最好。

(如果只是因为 DBMS 不必将中间结果发送回客户端并解析和优化两个单独的语句,那么第二个选项通常会超过第一个选项的总工作量。)

此外,第二条语句的结果集行大小要大得多(因为“*”覆盖了 3 个表中的列,而不是 1 个)。这确实不是两个等效 SQL 语句的公平比较。

【讨论】:

  • 同意.. 在第二个查询中,我应该将选择限制为 order_details。*
【解决方案2】:

我建议同时尝试它们并进行基准测试。因为它可能取决于索引、列大小和行数。

应该不难,因为例如 phpMyAdmin 会显示它执行的每个查询的执行时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多