【发布时间】:2013-09-16 20:50:55
【问题描述】:
我们最近从关系型 (MySQL) 转向 NoSQL (couchbase)。基本上它是社交手机游戏的后端。我们在扩展后端以处理越来越多的用户时面临很多问题。当使用 MySQL 加载用户时,由于多个表之间存在大量连接,因此需要花费大量时间。迁移到 couchbase 后,我们看到了巨大的改进,尤其是在加载数据时,因为大部分数据都保存在一个文档中。
不利的一面是,就查询而言,couchbase 似乎也有很多限制。 SQL 查询的 Couchbase 替代方案是视图。虽然我们设法使用 map-reduce 处理了大部分查询,但我们确实很难弄清楚如何处理基于时间的查询。例如我们需要根据时间戳属性过滤用户。如果时间小于当前时间,我们只需要查看用户:
if(user.time < new Date().getTime() / 1000)
发生的情况是,一旦用户的时间设置为未来某个时间,它就会从这个视图中豁免,这是所需的行为,但除非我们更新它,否则它永远不会被添加回视图 - 文档只会被重新编入索引查看更新时间。
我们现在的解决方案是加载前 x 个用户文档,然后在我们的应用程序中检查时间。排序是在 user.time 属性上完成的,所以我们得到那些时间小于或接近当前时间的用户。但我不确定这是否真的可以在现场环境中工作。理想情况下,我们希望避免在应用程序级别进行此类检查。
也有时间,例如当我们需要检查多个基于时间的属性时进行匹配。我们当前的策略在这种情况下不起作用,并且我们经常从视图中获取在应用程序中完成时未通过这些检查的文档。如果已经解决过类似问题的人可以分享他们的经验,我将不胜感激。提前致谢。
更新:
我们尝试使用仅适用于一个键的范围查询。就像我说的那样,在大多数情况下,我们有多个基于时间的键,这意味着多个范围不起作用。
【问题讨论】:
标签: mapreduce nosql couchbase couchbase-view