我应该将多个ID存储为varchar并使用FIND_IN_SET吗?

时间:2012-09-20 23:30:05

标签: mysql sql performance

我看到平台使用它:

- properties table -
id | name | ID_CATEGORY (INT)

- categories table -
id | name

- property_categories -
id_category | id_property

使用

按类别检索属性
SELECT * FROM properties, categories, property_categories
WHERE 1
   AND categories.name = "Some category name here" # match this category name
   AND categories.id = property_categories.id_category # match category
   AND properties.id = property_categories.id_property # and match property

但我最近在一个应用程序中看到了这个(有2个表而不是3个):

- properties table -
id | name | ID_CATEGORY (VARCHAR(255))

- categories table -
id | name

使用此查询按类别检索属性:

SELECT * FROM properties, categories
WHERE 1
   AND categories.name = "Some category name here" # match this category name
   AND FIND_IN_SET(categories.id, properties.ID_CATEGORY)

是否有任何性能优势?是否应该使用第二种方法来支持第一种方法?如果我保持不变可以吗?

有时会有很多字段组合在一起(包括ID_TYPE,ID_STATUS等),并且有一个很大的JOIN将所有数据粘合在一起用于过滤器。

1 个答案:

答案 0 :(得分:2)

FIND_IN_SET用于逗号分隔的字符串,例如

SELECT FIND_IN_SET('b','a,b,c,d');

这将是存储一堆值的糟糕方式 - 例如,您无法使用索引来查找“b”。

使用多行。