2

考虑一个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 索引categoryproducts

4

3 回答 3

5

尝试使用FIND_IN_SET功能。

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

然后,您可以将结果与规范化方法进​​行比较,但这肯定比多个 LIKE 子句更健壮

于 2012-06-18T12:35:59.777 回答
3

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

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

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

于 2012-06-18T12:33:12.827 回答
1

采取标准化的方法。

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

于 2012-06-18T12:33:48.623 回答