使用或不使用内部连接优化master/detail mysql查询

pokxtpni  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(366)

mysql不是我的专业领域,因为我从不需要处理大型表,所以我的基本知识已经足够了——直到现在:)
当我有一个master/detail mysql表时,我总是这样做查询:

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

但是现在,我有太多的行,所以查询速度很慢。我试着理解“内部”语法,我想出了

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

但时间还是一样。。。所以:
1) 这是否意味着执行内部联接与手动检查主/详细字段相同?
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 |
+----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+
bkhjykvo

bkhjykvo1#

INNER JOIN 不会比 WHERE 因为查询优化器应该为提供的两个查询生成相同的执行计划。然而,不同的数据库引擎可能会产生不同的执行计划,但是对于更复杂的查询,通常会观察到这种行为(这里不是这样)。我建议测试这两个查询并选择一个更快的查询。
作为一般建议,我建议 INNER JOIN 哪个imo更具可读性,它减少了在 WHERE 可能导致 CROSS JOIN .

6tqwzwtp

6tqwzwtp2#

对于具有master和detail性能的查询(假设detail表中有interestingfield),请确保在

create index  idx1 on detail (interestingField, masterId )

对于内部连接和where,基于where的隐式连接是管理连接的旧方法。。最新版本基于显式连接条件,例如:

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

每种方法的性能都是一样的

相关问题