【发布时间】:2016-06-18 00:19:06
【问题描述】:
我有一个复杂的查询,它需要来自总共 4 个表的字段。内部连接导致查询花费的时间比它应该的长得多。我运行了一个 EXPLAIN 语句,其视觉结果附在下面:
这是我的查询:
SELECT
pending_corrections.corrected_plate , pending_corrections.seenDate
FROM
(pending_corrections
INNER JOIN cameras ON pending_corrections.camerauid = cameras.camera_id)
INNER JOIN
vehicle_vrn ON (pending_corrections.corrected_plate = vehicle_vrn.vrn500
OR pending_corrections.corrected_plate = vehicle_vrn.vrnno)
INNER JOIN
vehicle_ownership ON vehicle_vrn.fk_sysno = vehicle_ownership.fk_sysno
WHERE
pending_corrections.seenDate >= '2015-01-01 00:00:00'
AND pending_corrections.seenDate <= '2015-01-31 23:59:59'
ORDER BY pending_corrections.corrected_plate , pending_corrections.seenDate ASC;
我怎样才能达到相同的效果,但在其中一个联接中没有 OR?
【问题讨论】:
-
这个加入条件看起来不太好:(pending_corrections.corrected_plate = vehicle_vrn.vrn500 OR pending_corrections.corrected_plate = vehicle_vrn.vrnno) - 就性能而言...您是否尝试使用 EXISTS(. ..) 子查询而不是 INNER JOINS,因为您没有从连接表中选择任何数据?
-
ORed 连接条件通常不好(防止使用索引),常见的解决方法是使用UNION重写。 -
@dnoeth 你有什么建议可以用 UNION 代替吗?
-
@Dot NET: 1) 在寻求查询帮助时,请包括您的架构定义。 2) 全表扫描的性能并不总是比索引查找差 3) 为了猜测是否用索引查找替换全表扫描,您需要查看 all 的基数i> 谓词 - 再次从您的问题中丢失
-
@Dot NET:解释计划的简洁视觉表示 - 你用什么来得到它?
标签: mysql sql database performance relational-database