gpt4 book ai didi

MySQL ORDER BY 导致 LEFT JOIN 速度极度减慢

转载 作者:行者123 更新时间:2023-11-29 10:33:56 24 4
gpt4 key购买 nike

我有一个查询如下:

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 BYLEFT JOIN,则需要 0.00035 秒才能完成。

为什么速度这么慢?大概是因为 MySQL 在执行 ORDER BY 之前对每一行进行LEFT JOINing。如果这是正确的,有没有办法可以防止这种情况发生,并让 MySQL 在过滤、限制和排序之后执行 LEFT JOIN ?

最佳答案

为了实际只读取 25 行(请参阅 LIMIT 25 ), INDEX需要克服ORDER BY .

对于INDEX超越ORDER BY ,索引需要以 ORDER BY 中的列结束( ScheduleDate ,在您的情况下;还有其他标准,但满足了)。 并且您需要完全完成 WHERE条款。

完全通过WHERE子句,全部AND'd条款需要是column = constant<>不会的。 IS NOT NULL不会的。范围(在您的情况下不存在)不会起作用,除非它与 ORDER BY 相同。 .

所以,这是不可能的。

无论如何,DISTINCT (或 GROUP BY )意味着在计算 25 行之前必须进行重复数据删除。

但是是DISTINCT真的需要吗?好吧,可以有相同的多个副本Destination对于给定的MessageID ?如果没有,DISTINCT为你做点什么吗?

为什么有 LEFT ?这意味着Destination是可选的。

这是另一种表述;它可能会更好,也可能不会更好:

SELECT  O.MessageID, 
( SELECT Destination
FROM OutboundMessagesDetails
WHERE MessiageID = O.MessageID
) AS Destination
FROM OutboundMessages AS O
WHERE O.UserID = 18097
AND O.Status IS NOT NULL
AND O.Status <> 'Deleted'
ORDER BY O.ScheduleDate DESC
LIMIT 0, 25

注:内SELECT 可能需要DISTINCT .

你需要

INDEX(UserID,    -- first
ScheduleDate, -- second
Status, MessageID) -- (either order) to make it "covering"

哦,Status 的可能值是多少? ?如果只有一个其他选择,请将两个子句替换为 AND O.Status = 'Valid' 。现在您可以使用它来完成所有任务!

INDEX(UserID, Status, ScheduleDate, MessageID)

请注意,这与我之前的建议不同。

注:NULL不等于任何东西,甚至不等于 NULL .

而且,是的,另一个表需要 INDEX(MessageID, Destination) (除非它有 PRIMARY KEY(MesssageID) 并且是 InnoDB)。

关于MySQL ORDER BY 导致 LEFT JOIN 速度极度减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46864363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com