2015-04-02 143 views
1

這是關於一個網站,有10個產品飼料。 Feed每天導入多次。在每個輸入階段,我想保存在每個項目的skuprice的表格中(如果價格下降超過10%,則通過郵件發出警報)。優化日誌數據記錄的表結構

目前我存儲這些數據,如下所示:

primary_key sku  price datetime 
1    XYX  1  2015-04-02 20:10:59 
2    ZYZ  2  2015-04-02 20:10:59 
3    XYX  2  2015-04-03 20:10:59 
4    XYX  0.5 2015-04-04 20:10:59 

對於SKU XYX價格演變是1 - > 2 - > 0.5。在這個階段,我想發送一封警告郵件。我知道如何去做。問題在於,對於每個產品Feed,表格會增加大約50,000行。當試圖通過如下查詢得到結果時:

SELECT sku, 
     group_concat(cast(price as char(10)) separator '->') 
FROM table1 
GROUP BY sku 
ORDER BY datetime 

......它至少需要5秒鐘。雖然時間過去了,但表格會有更多的行並且查詢時間會增加。例如,我可以刪除4天以前的記錄(因爲週末)。

我想使這個表如下:

id sku price 
1  XYX 1->2->3->2.3 
2  VZV 5->6->5->5.5 

...但在這種情況下,我不會是「能」按日期來刪除舊記錄,價格欄將不得不text/blob可能會對查詢時間合併(php + mysql)產生很大影響。

什麼是運行速度最快的查詢?

謝謝!

+0

大量的數據佔用大量的空間。大量的數據需要大量的時間來處理它。它看起來像你現在擁有正確的結構。 – 2015-04-02 18:53:55

+0

您需要在sku和價格列上添加索引。索引有助於優化查詢執行。 – akr 2015-04-02 18:54:28

+0

@ user2411276:在'sku'上添加索引只會使「內部服務器錯誤」崩潰腳本,我試過了。 – valicu2000 2015-04-02 19:02:37

回答

2

有一個衆所周知的性能問題group_concat,但使用DISTINCT這不是你的情況。

嘗試添加索引price柱:

ALTER TABLE `products` ADD INDEX `price` (`price`) 

由於是使用group_concat和運行查詢,以檢查是否表現較好的一個。另外,我會遵循@symcbean的建議。

另一種解決方案是,其具有兩個單列索引,如@ user2411276所示。

如果您有兩列的索引,查詢可能會更快(您應該測量)。雙列索引也可以用作單列索引,但僅限列出的列。

有時在(B)上有(A,B)和另一個索引的索引是有用的。這使查詢使用其中之一或兩者,但也使用更多的磁盤空間。

選擇索引時,還需要考慮插入,刪除和更新的效果。 更多索引,更新較慢,所以開始測試並祝你好運!

1

的SKU和價格列上創建索引:

alter table <table_name> add INDEX indx_sku (sku,price); 
+0

這不會使valicu2000發佈的唯一查詢變得更快。 – symcbean 2015-04-02 19:12:05

1

雖然對於同一行(多個字段)中存儲多個值的說法,大多數人都會同意,這應該是最後的手段,當正確的規範化解決方案無法滿足您的需求,但是我懷疑任何具有關係數據庫重要經驗的人都會認爲將多個值放入同一個領域永遠是一個好主意。

您現在是否遇到性能問題?如果是這樣,那麼在查詢,模式和解釋計劃中發佈另一個問題。

您在此處向我們顯示的查詢將讀取數百萬行,因此,需要時間。可能有很多優化模式/處理的範圍,例如只有當SKU價格發生變化時才添加記錄,但這可能會對其他地方產生很大影響。