我们目前在MySQL上运行我们的应用程序,并计划迁移到MongoDB。我们已经移动了一些部件,但存在MongoRegex性能问题。
我们有一个自动完成搜索框,可以连接6个表(索引/非索引字段),并在mysql上以超快的速度返回结果。在MongoDB上,同样的事情执行起来非常慢。只有一次收集大约需要2.3秒。用户必须等待很长时间。连接时间为0.064秒。查询时间2.36秒。我用谷歌搜索了一下,找不到一个完美的答案。每个人都说MongoRegex很慢。如果这是真的,其他公司是如何解决这个问题的?
在MongoDB上运行时,改善自动完成性能/体验的最佳方法是什么?
发布于 2015-05-09 18:34:37
首先,你必须仔细设计你的查询。仔细选择适当索引的字段,并进行相应的设计。另外,如果您正在使用regex,请确保以一种强制查询使用索引字段的方式编写regex。像/^prefix/这样的内容就可以了。[请参阅此链接:http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use ]
我见过许多使用mongodb的范围查询的实现,但我不确定这是不是最好的,因为即时结果是一个关键的东西。
除此之外,我还看到一些推荐前缀树的人。其有效地将前缀存储在字段中,然后将以该特定前缀开始的所有单词作为数组存储在接下来的字段中。这个解决方案听起来令人信服,而且速度很快,因为前缀字段应该被索引,但您还必须考虑存储因素。
发布于 2015-05-09 18:27:50
很难说,因为我们没有搜索查询,但值得一提的是,在查看文档之后,似乎只有当模式是锚定的时,如果模式由常量字符串作为前缀,MongoDB才能够在使用RE搜索时使用索引
http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use
所以,引用这份文件:
如果正则表达式以插入符号(^)或左锚(\A)开头,后跟一串简单的符号,则该正则表达式是“前缀表达式”。例如,通过仅匹配以
abc开头的索引值,可以优化正则表达式/^abc.*/。
但是/abc.*/ ou /^.*abc/不会使用索引。
https://stackoverflow.com/questions/30138706
复制相似问题