使用或不使用INNER JOIN优化主/详细MySQL查询

时间:2018-10-22 09:04:16

标签: mysql

MySQL不是我的专业领域,并且由于我不需要处理大型表,因此我的基本知识已经足够-到目前为止:)

当我有一个主/详细MySQL表时,我总是这样查询:

SELECT SUM(detail.qty)
FROM master, detail
WHERE master.id = detail.masterId
  AND (interestingField = interestingValue)

但是现在,我也可能会详细说明行,因此查询速度很慢。我试图理解“ INNER”语法,然后想到了

SELECT SUM(detail.qty)
FROM master 
INNER JOIN detail ON master.id = detail.masterId
WHERE (interestingField = interestingValue)

但是时间仍然相同...所以:

1)这是否意味着执行INNER JOIN比手动检查master / detail字段更简单?

2)除了使用必填字段建立索引(我已经做过)之外,还有没有办法使查询更快?

谢谢您,如果问题显得愚蠢:(

-----根据要求,我将EXPLAIN输出添加到查询中

     +----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+
| id | select_type | table  |  type  | possible_keys |     key     | key_len | ref  |              rows               | Extra |             |
+----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+
|    |           1 | SIMPLE | bill_t | ALL           | PRIMARY,id  | NULL    | NULL | NULL                            |  4441 | Using where |
|    |           1 | SIMPLE | bill_d | ref           | billId,type | billId  | 5    | localtha_bg3667772802.bill_t.id |     2 | Using where |
+----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+

2 个答案:

答案 0 :(得分:0)

INNER JOIN不会比WHERE快,因为查询优化器应该为提供的两个查询生成相同的执行计划。但是,不同的数据库引擎可能会产生不同的执行计划,但是对于更复杂的查询,通常会观察到这种行为(此处不是这种情况)。我建议测试两个查询,然后选择速度更快的查询。

作为一般性建议,我建议使用INNER JOIN,它更易于阅读,并且可以降低省略WHERE子句中可能导致CROSS JOIN的条件的风险。

答案 1 :(得分:0)

对于具有主要和详细信息性能的查询,假设在明细表中有有趣的字段,请确保您在

上具有正确的复合索引
    create index  idx1 on detail (interestingField, masterId ) 

对于INNER JOIN和where,基于where的隐式联接是管理联接的一种旧方法..最新版本基于Explictic JOIN条件,例如:

  SELECT SUM(detail.qty)
  FROM master 
  INNER  detail ON master.id = detail.masterId
      AND interestingField = interestingValue 

每种方式的性能都相同