我在销售产品的网站上设有搜索工具 该页面是使用PHP和MySQL构建的,它针对的是一个将10多个表连接在一起的Merged View。视图中有大约12,000条记录,每条记录有20多个字段。
用户可以使用多个(10-15)选择菜单搜索符合特定条件的产品。
然后,数据库根据产品主键的选择菜单值返回结果。
这一切都很好,并且速度足够快。
但是,在同一页面上,我还添加了一个文本框,以便用户可以手动输入他们搜索的内容而不是使用菜单。
当用户输入实际单词而不是通过菜单选择PK时,数据库必须进行单词搜索。
由于缺乏对更好方法的了解,我将外国标准表中的所有文本值都整合到一个大字段中。
然后,文本框将搜索此连续字段中的单词。
同样,这很好用,但是将典型的搜索时间从0.1秒更改为2.0秒 我已经将合并视图使用的表中的所有字段编入索引以努力改善时间,但这并没有帮助。
由于Google可以在1秒内找到22,200,000页的“溢出”字样,而我的数据库只需2秒即可搜索只有12,000条记录的单词。
如何改进数据库的布局和搜索方法?
答案 0 :(得分:3)
在这种情况下,我强烈推荐Lucene Solr。它有一个非常适合这项任务的反向索引系统。您可以将它与PHP一起使用(通过前端与它连接)。
对它进行破解(至少看一些教程),你会惊讶于你的运行速度。
答案 1 :(得分:1)
如果在一列或多列上创建FULLTEXT
索引,MySQL可以full-text search。来自O'Reilly Databases:
MySQL中的
FULLTEXT
索引允许数据库管理员和程序员将任何基于字符的字段(CHAR
,VARCHAR
或TEXT
)指定为FULLTEXT
index,允许对存储在那些字段中的数据进行复杂的文本搜索。不要将此功能与MySQL中的
LIKE
功能混淆。LIKE
更像是正则表达式。另一方面,FULLTEXT
索引是完全索引的字段,支持停用词,布尔搜索和相关性评级。
答案 2 :(得分:0)
我已经将所有文字都搞定了 来自外国标准的价值观 桌子分成一个大的领域。文本框 然后搜索其中的单词 这个一致的领域。
这对我没有意义。您是否尝试在适当的字段上使用WHERE LIKE?我错过了什么吗?
答案 3 :(得分:-2)
您应该考虑将这些单词保留在内存中,这样您每次需要单词搜索时都不必点击数据库。将您的单词组装成数据结构是可行的,您可以在部署时从数据库构建数据结构。