在MySQL中搜索来自char分隔文本字段的项目

时间:2011-12-30 22:30:51

标签: mysql sql database mysqli sql-match-all

我正在构建一个基于MySQL的应用程序,允许用户搜索一些设施。设施存储在一个TEXT列中,它们表示为“|” - 分隔字段。这是一个例子:

1|2|3|5|6|10|11|12|13|15|17|18|20|21|27|29|30|31|3...

您是否知道如何在MySQL中实现高效的搜索功能?让我们假设我们需要检索“包含”设施1,2和15的所有行,查询/方法是什么?我试图使用全文索引,但没有任何运气。

谢谢!

2 个答案:

答案 0 :(得分:2)

无法有效地搜索给定值的符号分隔字符串。

提高SQL效率的最佳方法是使用索引,但不能使用索引来帮助查找子字符串。

优化方案的最佳方法是使用单个索引的INT列创建子表,并将每个数值存储在单独的行上。然后,您可以借助索引有效地搜索它。

另请参阅我对Is storing a comma separated list in a database column really that bad?

的回答

关于将多个工具存储在不同的行上时的匹配问题,我添加了{Stack}上用于此类问题的sql-match-all标记。它经常出现,并且已经有很多好的答案。单击标签以查找它们。

答案 1 :(得分:0)

您可以使用FIND_IN_SET()功能。但是,这仅适用于以逗号分隔的列表,因此您必须预先处理字段:

SELECT ... WHERE FIND_IN_SET('something', STR_REPLACE(your_text_field, '|', ','));

性能可能会非常糟糕,因为您将在派生字段上进行搜索,这会排除使用索引。您最好将设计规范化,并将这些值拆分为子表。