【问题标题】:MySQL: Improve query time with word searchMySQL:通过单词搜索提高查询时间
【发布时间】:2009-07-08 03:29:22
【问题描述】:

场景

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

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

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

问题

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

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

同样,这工作正常,但将典型的搜索时间从 0.1 秒更改为 2.0 秒。
为了缩短时间,我已对合并视图使用的表中的所有字段进行了索引,但这根本没有帮助。

问题

由于 Google 可以在 1 秒内为“溢出”一词找到 22,200,000 个页面,而我的数据库仅针对 12,000 条记录搜索一个词需要 2 秒。

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

【问题讨论】:

  • 将您的 Web 应用程序与 Google 进行比较就是将苹果与橙子进行比较。他们甚至不使用传统数据库,而是使用面向列的数据仓库(称为 BigTable)来存储数据。它还分布在数千台服务器上,所以它当然会更快。他们花费了多年的努力来加快查询速度。
  • 我当然不希望能与 Google 的力量相媲美。我只是想学习一种比我上面所说的更好的单词搜索方法。

标签: php mysql search


【解决方案1】:

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

试一试(至少看看一些教程),你会惊讶于你的启动和运行速度。

【讨论】:

  • 感谢您的指点,看到 Lucene 和 Sphinx 一起提到了几次。我得好好读书。
【解决方案2】:

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

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

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

【讨论】:

  • 全文搜索是我最喜欢的选择,有谁知道这是否可以与合并视图一起使用,或者我是否必须摆脱视图?
【解决方案3】:

我已经连接了所有的文本 来自国外标准的值 表成一个大字段。文本框 然后搜索里面的单词 这个连接字段。

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

【讨论】:

  • 这是我自己想出的一种方法,不一定是最佳实践。这样做的原因是我必须针对外部表中的 15 个以上字段创建 LIKE 语句。因为我一直在使用视图,所以将它们连接到一个字段中似乎更有意义。
【解决方案4】:

您应该考虑将单词保留在内存中,这样您就不必在每次需要单词搜索时都访问数据库。将你的话组装成一个数据结构是可行的,你可以在部署时从你的数据库中简单地构建数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多