【问题标题】:Searching for keywords in mysql database most efficiently在mysql数据库中搜索关键字最有效
【发布时间】:2015-09-21 16:17:35
【问题描述】:

我正在做一个项目,我有一个数据库,其中包含一个汇总字段,该字段由网站访问者输入的 Web 表单填写。

当用户完成输入摘要字段时,我想使用用户在页面上输入的单词来查找数据库中包含他们在页面上填写的相同关键字的类似记录页。

我在想我可以拆分提交的摘要字符串,然后循环遍历数组并构建一个查询,这样查询最终会是这样的:

SELECT * 
FROM my_table 
WHERE summary LIKE '%keyword1%' 
OR summary LIKE '%keyword2' 
OR summary LIKE '%keyword3%';

但是,这似乎非常低效,并且由于数据库可能会变得非常大,因此可能会变成运行缓慢的查询。

然后我找到了 MySQL IN 子句,但这似乎只适用于多个值,其中一个字段只能连续包含其中一个值。

有没有一种方法可以使用 IN 函数,或者是否有更好的 MySQL 函数可以用来做我想做的事情,或者我的第一个想法是唯一的方法吗?

我想要实现的一个例子有点像 Stack Overflow。当您失去标题字段的焦点时,它会根据您提供的标题弹出类似的问题。

【问题讨论】:

  • 您使用的是 InnoDB 还是 MyISAM?在 MyISAM 中,有一个 match against 语句,对于全文字段来说非常强大。
  • @JayBlanchard 谢谢,但我使用的是 InnoDB,看起来全文函数仅适用于 MyISAM
  • 与 FTS 和 innodb 相关的是InnoDB FULLTEXT Indexes。请阅读Full-Text Restrictions。两者都直接来自手册
  • 所以在我看来,没有理由不能在同一个数据库中混合和匹配 myISAM 和 INNODB,在 MyISAM 中保持文本并进行连接。没什么大不了。这避免了“必须升级到 5.6 版”的说法

标签: php mysql full-text-search


【解决方案1】:

我建议阅读本手册页 InnoDB FULLTEXT IndexesFull-Text Restrictions 上的手册页。全文的新功能已合并到最近的 mysql 版本中,通过INNODB 表增加了它的使用。

关于无法升级mysql版本,没有理由不能在同一个数据库中混合和匹配MyISAMINNODB表。因此,可以将文本信息保存在 MyISAM(历史上 FTS 索引功能可用)中,并在需要时连接到 INNODB 表。这避免了“必须升级到 5.6 版”的说法。

图例:FTS=全文搜索

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多