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 |
+----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+
答案 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
每种方式的性能都相同