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 |
+----+-------------+--------+--------+---------------+-------------+---------+------+---------------------------------+-------+-------------+
2条答案
按热度按时间bkhjykvo1#
INNER JOIN
不会比WHERE
因为查询优化器应该为提供的两个查询生成相同的执行计划。然而,不同的数据库引擎可能会产生不同的执行计划,但是对于更复杂的查询,通常会观察到这种行为(这里不是这样)。我建议测试这两个查询并选择一个更快的查询。作为一般建议,我建议
INNER JOIN
哪个imo更具可读性,它减少了在WHERE
可能导致CROSS JOIN
.6tqwzwtp2#
对于具有master和detail性能的查询(假设detail表中有interestingfield),请确保在
对于内部连接和where,基于where的隐式连接是管理连接的旧方法。。最新版本基于显式连接条件,例如:
每种方法的性能都是一样的