0

我有一個MySQL查詢問題,因爲它需要太多的時間(約12秒),該表具有約70,000條記錄我的MySQL查詢需要太多的時間(約12秒) - 任何建議

這裏我的查詢:

SELECT DATE(`orders`.`date`) AS `dater`, 
     COUNT(*) AS `amount`, 
     (SELECT SUM(`amount`) FROM `payment` 
       WHERE DATE(`dater`)=DATE(`payment`.`posted_date`) 
     ) AS `charge` 
    FROM `orders` 
    GROUP BY `dater` 
    ORDER BY `dater` DESC 
    LIMIT 0,10 

正如你可以看到有2個表 1.表:訂單 它是訂單表我們這裏有1個主柱:日期(我們在這裏需要計算每日訂單)

樣本:

-------------------- 
date  | id 
-------------------- 
01-01-2017 | 1 
-------------------- 
01-01-2017 | 2 
-------------------- 
01-02-2017 | 3 
-------------------- 
  • 表:支付: 它是金錶在這裏,我們有2個主要欄目:posted_date,量(我們需要在這裏得到量字段的總和爲每天)
  • 樣品:

    -------------------- 
    posted_date | amount 
    -------------------- 
    01-01-2017 | 100 
    -------------------- 
    01-01-2017 | 50 
    -------------------- 
    01-02-2017 | 200 
    -------------------- 
    

    所以在結束時結果應該[日期,金額,收費]

    肯定在更短的時間,因爲它是不可能去這12個秒時:d

    我看到的問題是在這個內部SELECT:

    (SELECT SUM(`amount`) FROM `payment` 
        WHERE DATE(`dater`)=DATE(`payment`.`posted_date`) 
    ) AS `charge` 
    

    我怎樣才能避免犯SELECT內的任何建議SELECT查詢?

    +1

    也許考慮索引你的數據表 –

    +3

    'COUNT(*)'也是一個問題。它必須經過你的整個表格,如果它沒有正確的索引,它會變得更糟。 –

    +1

    我們可以看到你的模式嗎? –

    回答

    1

    你有一個相關的子查詢。 MySQL的查詢規劃人員以一種天真的方式處理這些問題,並將其禮貌地表達出來。

    重構查詢以使用連接。您的相關子查詢將看起來像一個可連接的查詢。

      SELECT SUM(amount) charge, 
            DATE(posted_date) posted_date 
          FROM payment 
          GROUP BY DATE(posted_date) 
    

    從付款表中每天獲得一行。

    接下來,您需要從您的訂單表中獲得類似的結果。

      SELECT DATE(date) AS dater, 
           COUNT(*) AS amount 
          FROM orders 
          GROUP BY DATE(date) 
    

    然後,加入這兩個一起

    SELECT a.dater, a.amount, b.charge 
        FROM (
         SELECT DATE(date) AS dater, 
           COUNT(*) AS amount 
          FROM orders 
          GROUP BY DATE(date) 
         ) a 
        LEFT JOIN (
          SELECT SUM(amount) charge, 
            DATE(posted_date) posted_date 
          FROM payment 
          GROUP BY DATE(posted_date) 
         ) b ON a.dater = b.posted_date 
    ORDER BY a.dater DESC 
    LIMIT 0,10 
    

    因此,有必要在這裏加入兩個子查詢,因爲你需要兩個聚集通過日期爲加入工作。

    +0

    這可以通過在每個子查詢中添加ORDER BY ... LIMIT 10來加快速度。加速的數量取決於_quadratically_日期的數量。 –