一件事情,要用 Big query 還是 Small queries 好呢?也就是用一個很複雜的 Query,還是拆成幾個小 Query 呢?

一件事情要用 Big Query 還是很多 Small Query (small queries),有很多因素要考慮。但擔心篇幅太多,僅供幾個引子,讓大家去想一下。

  1. Connection pool
  2. Lock
  3. Thread model

MongoDB 是 single thread model,也就是大多時候只會用到一顆 CPU,而 Query 會 Read lock, Insert / Remove / Update 還會加上 Write lock。

所以若是 MMAPv1 引擎,collection-level locking 會讓 Query 只能在單一 collection 中處理 (Read lock),再加上沒有 MVCC 以及天生的 single thread model,所以無法有效處理高併發。這時候通常 Big Query 會比 Small queries 來得好。

反之若是 WiredTiger,document-level locking 加上 MVCC 設計,比較能處理高併發。這時候通常 Small queries 會比 Big Query 來得好。

可是事事無絕對,還是要看什麼樣的 Query。例如多大的 Query、是不是跨 Collections 的 Query 等。

但無論哪個引擎,都會受限在 MongoDB 天生是 single thread model 的設計,無法善用多核 CPU。所幸 MongoDB 天生擁有良好的 Sharding 技術,可以跑多個 MongoDB instances 並採用 Sharding 技巧,還是可以盡量壓出機器的效能。

單機跑多 instances 可以參考官方文件 http://docs.mongodb.org/manu…/tutorial/deploy-shard-cluster/