2010-09-02 46 views
0

我想找出處理插入/更新/刪除大型列表的最佳方式。我應該如何在mysql中插入/更新/刪除大型列表?

具體來說,我的用戶需要選擇產品的大名單,他們每天晚上都將獲得這些項目的報告。

過於簡單化了,這裏是數據模型(一個簡單的多對多)

~ 5000 records total 
+----------+------------+ 
| user_id | user_name | 
+----------+------------+ 
|  1 | Ralph  | 
|  2 | Bill  | 
|  3 | Joe  | 
|  4 | Mike  | 
|  5 | Brian  | 
|  6 | Jose  | 
+----------+------------+ 

~ 6000 records total 
+------------+------------+ 
| product_id | product | 
+------------+------------+ 
|   1 | Widget A | 
|   2 | Widget B | 
|   3 | Widget C | 
|   4 | Widget D | 
|   5 | Widget E | 
|   6 | Widget F | 
+------------+------------+ 

As many as 30 million total 
+----------+------------+ 
| user_id | product_id | 
+----------+------------+ 
|  1 |   1 | 
|  1 |   4 | 
|  1 |   6 | 
|  2 |   2 | 
|  2 |   4 | 
|  2 |   5 | 
+----------+------------+ 

的問題是,該產品在批量選擇,所以如果用戶點擊選擇所有(這是他們經常做的),他們正在選擇大約6000個產品,這相當於一個大的插入查詢。

而且,他們可以更新和刪除基於一串不同的標準,這些列表,如哪些類別,他們下跌,價位等

他們要更新他們的名單我每次都要檢索他們選擇的產品,刪除他們已取消選擇的產品,然後插入任何新產品。

的過程充其量似乎很麻煩,我想知道是否有更好的解決方案。

我考慮的,而不是存儲在用戶需要的產品,只存儲產品的用戶不希望因此限制了頻繁的大插入/更新查詢的開銷。 這樣,每個用戶默認都可以獲得每種產品。

與解決方案的問題是,當新項目到達用戶可能不希望在報告中這些項目所以後來我就必須保持一個單獨的表,規定什麼樣的默認項。

非常感謝誰能幫助我。

編輯:只是爲了澄清,該用戶不僅限於選擇標準。他們也可以直接選擇產品和產品組。用戶是獨一無二的,因爲他們都非常熟悉產品(大部分知道幾乎所有6000種產品)。

回答

0

另一種可能性是對用戶產品表進行分區。 MySQL 5.1中添加的表分區支持:

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

他們要更新他們的名單我每次都要來檢索他們所選擇的產品,刪除他們已經取消了產品,然後插入任何新產品。

我想指出的是,我認爲最終會發生的情況是,實際的數據將分散到整個存儲空間,因爲您不會刪除所有內容,然後重新添加它。優化器可能會認爲執行全面掃描會比隨機搜索遍及索引的地方更高效。雖然我不確定這一點。

1

你可能想嘗試存儲的選擇標準,而不是產品本身。例如,存儲「價格< 10」和「category ='sports」「,而不是存儲符合這些標準的(可能很長的)產品列表。然後,您可以通過將選擇標準應用於當前產品列表來重新創建列表。

你必須弄清楚你應該用什麼語法來存儲標準。也許SQL會起作用,也許你會想要別的東西。修改可能會很棘手,您需要執行一些簡單的邏輯來減輕這種影響標準必須是簡單字段/值比較的AND的OR。

這種方法的麻煩在於,如果您不小心,您需要將用戶限制在某些選擇標準,這可能會導致相當大的盲區(很多用戶要求您實施自己的定製標準)。我不確定我會向所有人推薦這種方法,但這是另一種選擇。

+0

這需要使用動態SQL來使用選擇條件,並且在產品/ etc被添加到該限制內時會有風險。如果客戶購買特定產品,還會報告*非常*痛苦檢索... – 2010-09-02 04:53:01

+0

我會考慮這種方法,但用戶選擇不僅僅基於標準。他們也可以通過產品ID選擇單個產品。 – 2010-09-02 05:44:10

+1

您的標準之一可以是「productId =」。你只是在賭用戶只選擇幾種產品,並非全部都是6000. – 2010-09-02 06:34:55

0

你可以在你的關聯表中增加一個額外的REPORT_ON列嗎?該表中的行將保持或多或少靜態,並且當用戶主動更改標準時,您只需更新單行和批行。

+0

對不起,我沒有完全理解。你是否建議我創建第三列來指定是否包含該項目? – 2010-09-02 15:20:45

+0

@ Bill H:是的,那正是我的建議。 – 2010-09-02 20:26:33

相關問題