【发布时间】:2018-04-02 12:37:39
【问题描述】:
我有一个查询如下:
SELECT DISTINCT O.MessageID, OD.Destination
FROM OutboundMessages AS O LEFT JOIN
OutboundMessagesDetails AS OD
ON OD.MessageID=O.MessageID
WHERE O.UserID = 18097 AND
O.Status IS NOT NULL AND
O.Status <> 'Deleted'
ORDER BY O.ScheduleDate DESC
LIMIT 0, 25
大约需要 50 秒才能完成。解释如下:
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE O NULL index PRIMARY,UserSchedule UserSchedule 4 NULL 15055 0.08 Using where; Using temporary
1 SIMPLE OD NULL eq_ref PRIMARY PRIMARY 8 NMV2_Messaging.O.MessageID 1 100.00 Using index; Distinct
请注意,ORDER BY 子句位于第一个表中的字段上 (OutboundMessages AS O)
如果我删除 ORDER BY 或 LEFT JOIN 需要 0.00035 秒才能完成。
为什么会有这么慢的速度?大概是因为 MySQL 在执行ORDER BY 之前的每一行都是LEFT JOINing。如果这是正确的,有没有办法可以防止这种情况并让 MySQL 在过滤、限制和排序之后执行LEFT JOIN?
【问题讨论】:
-
请确保加入的表字段具有相同的数据类型。我的意思是 OutboundMessagesDetails.MessageID 和 OutboundMessages.MessageID 必须是相同的数据类型才能快速运行。
-
这些表上有哪些索引(和键)?
-
@LokeshKumarGaurav - 数据类型相同。
-
@Paul Spiegel - 主键是 MessageID,索引在 (UserID, ScheduleDate) (除其他外,但这是这里唯一相关的索引)
-
如果
MessageID在两个表中都是PK(一对一关系),那么您不需要DISTINCT,因为您的查询不可能重复。但是 - 即使引擎需要对 15K 行进行两次排序(一次用于 DISTINCT,一次用于 ORDER BY),也不应该花费 50 秒。
标签: mysql sql indexing left-join sql-order-by