[英]How to make Order By faster in MySql?
我有兩個表用戶和交易。 用戶表包含 UserId 和 UserName 列,交易表包含 TransactionId、Amount(decimal) 和 UserId 列。 當我運行以下查詢時,即使在 10 分鍾后它也不會停止:
SELECT u.UserName,
(SELECT COALESCE(SUM(t.Amount), 0.0)
FROM Transactions AS t
WHERE t.UserId = u.UserId) AS `Sum`
FROM Users as u
ORDER BY Sum
LIMIT 10
如果沒有 Order By,它會在不到 1 秒的時間內工作。 我不能使用分組依據。 我應該怎么寫才能讓它工作得更快。
當我在沒有 Order By 的情況下獲取所有數據並在 IDE 中按 Sum 對它們進行排序時,它在不到 1 秒的時間內工作。 為什么 MySql 不像 IDE 那樣工作。(我使用的是 JetBrains DataGrip)
A計划——把它翻過來。
SELECT u.UserName, x.Sum
FROM
( SELECT t.UserId,
COALESCE(SUM(t.Amount), 0.0) AS Sum
FROM Transactions AS t
GROUP BY t.UserId
ORDER BY Sum
LIMIT 10
) AS x
JOIN Users AS u ON u.UserId = x.UserId
建議指數:
t: INDEX(UserId, Amount)
這應該更快,因為子查詢只查看 1 個表,然后只需要在另一個表中查找 10 次。
B計划——匯總表:
你有幾百萬行? 然后,我建議您構建並維護一個匯總表,其中包含每天的小計 ( SUM
)。 然后總結總和以非常有效地獲得總計。 這樣,子查詢(無論哪種形式)都會運行得更快。
如果我的建議沒有太大幫助,請告訴我們有多少不同的用戶以及有多少交易。 以及每個用戶每天有多少筆交易。 (可能按周總結會更好。)
為什么 ORDER BY 很重要
沒有ORDER BY
,只會查找 10 個用戶。 (不是你想要的 10 個)當然, ORDER BY
是找到總數最小的 10 個所必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.