2017-08-02 42 views
1

感謝花在了我的問題,對不起,如果它已經時間已經問過類似的東西。PHP - MySQL的1.000.000記錄查詢優化

我有一個DB的下面的示意圖:

db scheme

我只爲DB SELECT權限。 而我的查詢往往會在當前設置下運行2-3秒到10秒。 有人問我,優化至最佳配置的當前結構和我的SQL是這樣的:(我需要獲得所有的訂單,其爲1個月的間隔內對每種產品的總收入)

SELECT items.`type` AS type, 
    DATE(orders.date) AS date, 
    sum(items.price * orders.quantity * clients.discount_percent/100) AS total 
    FROM orders 
INNER JOIN items ON orders.item = items.id 
INNER JOIN clients ON orders.`client` = clients.id 
GROUP BY DATE(orders.date), items.`type` 

我正在考慮通過修改SQL方面的數據來處理結果 - 但不確定它是否會有效。

很想聽聽形成雅,如果這可以優化:)。

KR, 昏頭昏腦

附: EXPLAIN結果: EXPLAIN

+0

你有索引日期列(也是項目,客戶端)嗎? – Maadinsh

+1

你對這些表有什麼指標? EXPLAIN爲這個查詢顯示什麼? –

+1

你應該從獲得解釋計劃開始。但是,如果你不被允許創建索引,它會很有趣。 –

回答

0

字段orders.itemorders.client被索引?如果你用Phpmyadmin創建一個表,你必須指定這些字段作爲索引和關係,所以當你使用JOIN這樣的查詢時,查詢是最適合搜索的。

當然你也可以ALTER你的表,並設置像INDEX領域,但他們必須是同一類型或關係將不能especified的!示例您的PRIMARY KEYFOREIGN KEY必須是INT UNSIGNED

我希望你認爲這個答案有用。

0

一般來說,你的性能問題是一個全表掃描,由於在「訂單」

很奇怪一個這麼大的運行時間爲一個小的數據集(〜10MB)。我的服務器上的類似查詢需要1秒或更短的時間。

嘗試優化數據類型,以適應更小的數據尺寸。 (對於索引,你必須使用int)。

檢查Orders.Data是否有索引。

檢查Orders.Data是Date類型,以提高索引性能。

在所有的情況下,您使用的是一些聚合函數(組和總和),這些類型的功能是非常昂貴的,因爲服務器首先生成一個大表中的所有數據後執行聚合函數。

如果您的性能問題是由於服務器配置(工作量,RAM或......),你可以緩存結果以避免重新計算每次所有結果。