MongoDB 2.5 版本将提供新的查询引擎
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB 2.5.0 (开发版本)中,包含了一个新的查询引擎实现。查询引擎主要的工作是通过查询条件,查询到匹配的数据。当然,这其中包括对索引的使用。现有的查询引擎在MongoDB发布的4年以来基本没有进行什么变更。它最大的问题是缺乏扩展性,也没有查询优化的功能(我们知道,MongoDB的查询优化实际上是通过试错的方式来做的)。
在2.5.0版本中,查询引擎被完全重写,它包括三个独立的部分:
- 一个语法树(AST:abstract syntax tree)模块,用于解析查询语句
- 一个解析模块,将BSON的查询条件解析成AST
- 一个完全重写的查询API层,其功能和现有的查询模块类似
本次改动主要是为后续的查询优化工作铺路,其中很重要的一个功能点,就是索引交集的实现。比如你的查询条件是 {a:5, b:6} ,而这时候你分别有a和b两个字段的独立索引。在现在的查询引擎下,MongoDB只能使用其中一个索引。比如找出所有a的值为5的记录,再逐条遍历,查 询出b为6的值。(或者反过来查b的索引,再遍历出a为5的值)。索引交集功能则可以在现有的情况下,通过对a,b两个独立的索引求交集,直接获取到 a=5,b=6的记录(目前的稳定版中,需要建一个联合索引才能实现)。除了普通索引外,这一功能还会扩展到地理位置索引,全文索引上。(比如获取所有在 3.5公里以内,符合xxx条件的人)
另外利用新的查询引擎,还可以实现一些更高级的查询,比如查询出 a == b + c 的记录。以后你可以这样写:{ a : { $sum : [ “$b” , “$c” ] } })。这样的功能对新的查询引擎来说很容易实现。
新的查询引擎目前已经重写完成并且可以测试了。如果你有兴趣测试测试,可以下载最新的2.5.0版本试玩。【下载】
相关代码都在github上面: