我正在构建一个基于 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 的所有行,查询/方法是什么?我试图使用全文索引,但没有任何运气。
我正在构建一个基于 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 的所有行,查询/方法是什么?我试图使用全文索引,但没有任何运气。
没有办法有效地在符号分隔的字符串中搜索给定值。
在 SQL 中提高效率的最好方法是使用索引,但不能使用索引来帮助查找子字符串。
优化方案的最佳方法是创建一个具有单个索引 INT 列的子表,并将每个数值存储在单独的行中。然后您可以借助索引有效地搜索它。
另请参阅我对在数据库列中存储逗号分隔列表真的那么糟糕吗?
关于将多个设施存储在单独的行中时匹配它们,我添加了sql-match-all
在 Stack Overflow 上用于该类型问题的标签。它经常出现,并且已经有很多好的答案。单击标签以找到它们。
您可以使用FIND_IN_SET()函数。但是,这仅适用于逗号分隔的列表,因此您必须预处理您的字段:
SELECT ... WHERE FIND_IN_SET('something', STR_REPLACE(your_text_field, '|', ','));
性能可能会很糟糕,因为您将在派生字段上进行搜索,这排除了使用索引。您最好对设计进行规范化,并将这些值拆分为子表。