2012-06-18 37 views
0

考慮表格products,其中包含產品詳細信息,包括其類別。一種產品可能屬於多個類別,因此我將它保留爲逗號分隔的類別ID列表。MYSQL逗號分隔的ID與單獨的表格

我知道這不是標準化的方法。

任何MYSQL專家都可以告訴我哪種方法選擇特定類別的產品會更快。

顯然我們必須加入products表和products_category_relation表如果採取規範化的方法。

在我的做法,我們必須寫一個像查詢找到所需的產品(假設我們正在尋找類別編號10)

SELECT p.* 
FROM products p 
WHERE p.category like '10' 
OR p.category like '10,%' 
OR p.category like '%,10' 
OR p.category like '%,10,%' 

任何一個可以告訴我,如果這種方法速度更快還是JOIN方法會更快?

我知道正常化。我瞭解我的方法中涉及的其他風險。但在我的情況下他們並不重要。所以,我關心速度。

歡迎任何有關其速度或實際測試結果的理論解釋。

UPDATE

我使用MyISAM引擎 產品表上products

回答

2

符合第一範式的數據庫的category列主鍵product_id 全文索引會快很多。您的示例查詢不能使用任何索引,並且需要全表掃描來解決。更糟糕的是,它必須掃描整個文本字段的所有行,文本工作幾乎總是比計算機的整數工作更昂貴。

標準化表可以輕鬆使用類別列上的索引來加速查詢。

文本存儲也可能需要更多的磁盤空間,因爲在保存爲字符時,數字通常比正確的整數類型更昂貴(當然在行存儲中也涉及一些開銷)。

+0

「這也將需要更多的磁盤空間,因爲當保存爲數字通常比較昂貴」 @EmilVikstrom,我認爲對於大數字這是真的。通常類別ID不超過3個字符。 – Imdad

+1

在這種情況下,Imdad使用'UNSIGNED SMALLINT',它使用2個字節,範圍從'0'到'65535'。 –

+0

就目前而言,你的答案似乎比其他人好。 +1 – Imdad

1

採取規範化的方法。

你沒有給出有關表格的更多信息,表格和你正在使用的引擎上設置的鍵和索引,但幾乎在任何情況下JOIN都會更快(比like -mess快得多)。

+0

檢查更新請 – Imdad

5

嘗試使用FIND_IN_SET函數。

SELECT * FROM `products` WHERE FIND_IN_SET('10',`category`)>0; 

然後,您可以比較的結果VS標準化的做法,但是這絕對會比多LIKE子句更強大的

+0

對於FIND_IN_SET爲+1 – Imdad

+0

它更健壯,工作正常,但談到性能仍然比單獨的錶慢 – CodeBrauer