MySQL:使用单词搜索缩短查询时间

时间:2009-07-08 03:29:23

标签: php mysql search

方案

我在销售产品的网站上设有搜索工具 该页面是使用PHP和MySQL构建的,它针对的是一个将10多个表连接在一起的Merged View。视图中有大约12,000条记录,每条记录有20多个字段。

用户可以使用多个(10-15)选择菜单搜索符合特定条件的产品。
然后,数据库根据产品主键的选择菜单值返回结果。

这一切都很好,并且速度足够快。

问题

但是,在同一页面上,我还添加了一个文本框,以便用户可以手动输入他们搜索的内容而不是使用菜单。

当用户输入实际单词而不是通过菜单选择PK时,数据库必须进行单词搜索。 由于缺乏对更好方法的了解,我将外国标准表中的所有文本值都整合到一个大字段中。
然后,文本框将搜索此连续字段中的单词。

同样,这很好用,但是将典型的搜索时间从0.1秒更改为2.0秒 我已经将合并视图使用的表中的所有字段编入索引以努力改善时间,但这并没有帮助。

问题

由于Google可以在1秒内找到22,200,000页的“溢出”字样,而我的数据库只需2秒即可搜索只有12,000条记录的单词。

如何改进数据库的布局和搜索方法?

4 个答案:

答案 0 :(得分:3)

在这种情况下,我强烈推荐Lucene Solr。它有一个非常适合这项任务的反向索引系统。您可以将它与PHP一起使用(通过前端与它连接)。

对它进行破解(至少看一些教程),你会惊讶于你的运行速度。

答案 1 :(得分:1)

如果在一列或多列上创建FULLTEXT索引,MySQL可以full-text search。来自O'Reilly Databases

  MySQL中的

FULLTEXT索引允许数据库管理员和程序员将任何基于字符的字段(CHARVARCHARTEXT)指定为FULLTEXT index,允许对存储在那些字段中的数据进行复杂的文本搜索。

     

不要将此功能与MySQL中的LIKE功能混淆。 LIKE更像是正则表达式。另一方面,FULLTEXT索引是完全索引的字段,支持停用词,布尔搜索和相关性评级。

答案 2 :(得分:0)

  

我已经将所有文字都搞定了   来自外国标准的价值观   桌子分成一个大的领域。文本框   然后搜索其中的单词   这个一致的领域。

这对我没有意义。您是否尝试在适当的字段上使用WHERE LIKE?我错过了什么吗?

答案 3 :(得分:-2)

您应该考虑将这些单词保留在内存中,这样您每次需要单词搜索时都不必点击数据库。将您的单词组装成数据结构是可行的,您可以在部署时从数据库构建数据结构。