MYSQL以逗号分隔的ID与单独的表

时间:2012-06-18 12:28:50

标签: mysql

考虑一个表products,其中包含产品详细信息,包括其类别。一个产品可能属于多个类别,因此我将其保留为逗号分隔的类别ID列表。

我知道这不是规范化的方法。

任何MYSQL专家都可以告诉我哪种方法可以更快地选择特定类别的产品。

显然,如果采用规范化方法,我们必须加入products表和products_category_relation表。

在我的方法中,我们必须编写一个类似的查询来查找产品(假设我们正在搜索类别ID 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方法会更快吗?

我知道正常化。我知道我的方法涉及的其他风险。但在我的情况下,它们并不重要。所以,我关注速度。

欢迎任何有关其速度或实际测试结果的理论解释。

更新

我正在使用myISAM引擎 产品表有主键product_id category

products列上的FullText索引

3 个答案:

答案 0 :(得分:5)

尝试使用FIND_IN_SET功能。

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

然后您可以比较结果与规范化方法,但这肯定比多个LIKE子句更强大

答案 1 :(得分:2)

符合第一范式的数据库会快得多。您的示例查询无法使用任何索引,需要全表扫描才能解析。更糟糕的是,它必须扫描所有行的整个文本字段,并且文本工作几乎总是比计算机的整数工作更昂贵。

规范化表可以轻松使用类别列上的索引来加速查询。

文本存储可能还需要更多磁盘空间,因为数字在保存为字符时通常比正确的整数类型更昂贵(当然行存储中也存在一些开销)。

答案 2 :(得分:1)

采取规范化的方法。

您没有提供有关所涉及的表,在该表上设置的键和索引以及您正在使用的引擎的更多信息,但几乎在任何情况下JOIN都会更快(比like - 。乱七八糟)