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上面: