簡體   English   中英

如何在 MySql 中使 Order By 更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM