MongoDB 計畫快取的影響

來源:互聯網
上載者:User

MongoDB 計畫快取的影響

MongoDB 2.6 複製集Primary建立索引後,發現Secondary的查詢沒有走最新的索引。

臨時清理掉該集合的計畫快取後正常。筆者觀察到出現效能問題時,語句並沒有走最優的執行計畫。

對於MongoDB 3.0.3及之前的版本,可以通過如下兩種方法得到解決: 
1. 對於查詢顯式指定hints。   
2. 設定查詢計劃緩衝索引過濾器來重寫預設查詢計劃。

在3.0.4版本中修複了。

SERVER-15225,SERVER-20139 
https://jira.mongodb.org/browse/SERVER-15225

    執行計畫cache的重新整理問題,對同一種類查詢,執行計畫有cache就不去驗證,同一種類查詢但是條件不同可能的執行情況也不同。

    可以通過internalQueryCacheReplanningEnabled參數的設定來解決 
    The query optimizer caches plans for each query shape and reuses these plans for a time. In situations where the performance of the cached plan is poor for a particular instance of the query shape, the optimizer may select a the plan with poor performance and fail to evict the cache entry. This behavior may impact deployments where two queries with the same shape have different performance characteristics if they have different selectivity.   
    This improvement makes the query planner evaluate the cost of the cached query plan, and if the cost of this plan is too high, the query planner switches to a more efficient plan. This more efficient plan is then cached for future use.   
    This improvement is not enabled by default. To enable by default set the internalQueryCacheReplanningEnabled parameter totrue using the setParameter command on a running system, or at start time using the setParameter commandline option orsetParameter in the configuration file.   
    For example, to enable using setParameter:   
    db.runCommand({setParameter: 1, internalQueryCacheReplanningEnabled: true})   
    This improvement can be disabled as follows:   
    db.runCommand({setParameter: 1, internalQueryCacheReplanningEnabled: false})   
    3.0.4可以使用這個參數,預設是關閉

查詢計劃

在給定可用索引的情況下,MongoDB查詢最佳化工具處理查詢並且選擇出針對某查詢而言最高效的查詢計劃。每次查詢執行的時候,查詢系統都會使用該查詢計劃。

查詢最佳化工具只會對那些看起來有多個可行計劃的查詢計劃進行緩衝。

集合內容發生改變的時候,查詢最佳化工具會重新評估查詢計劃,以保證最優的查詢計劃。您可以通過使用 索引過濾器 來指定最佳化器評估的索引。

針對一個給定查詢,您可以使用 explain() 方法查看查詢計劃的統計。

查詢計劃修訂

伴隨著集合隨著時間的變化而變化,在下面幾種情形之一,查詢最佳化工具都會刪除查詢計劃並且對其進行重新評估: 
    1. 集合接收1,000個寫操作。   
    2. The reIndex rebuilds the index.   
    3. 您增加或者刪除一個索引。   
    4. The mongod process restarts.

緩衝查詢計劃介面

2.6新版功能

MongoDB提供了查詢計劃緩衝命令和方法來查看和修改已緩衝的查詢計劃。

db.runCommand( { planCacheListFilters: Product } )
db.runCommand(   
  {   
      planCacheListPlans: "Product",   
      query: { Path: /^9-1-6(-\d+)*$/, "Status": { $lt: 4 } }   
  }   
)
db.runCommand(   
  {   
      planCacheClear: "Product",   
      query: { Path: /^9-1-6(-\d+)*$/, "Status": { $lt: 4 } }   
  }   
)
db.runCommand(   
  {   
      planCacheClear: "Product"   
  }   
)

索引過濾器

2.6 新版功能.

索引過濾器會決定最佳化器評估哪一個索引作為一個 query shape 。一個查詢形狀由查詢、排序以及映射說明組成。如果一個給定的查詢形狀存在一個索引過濾器,最佳化器將只會考慮過濾器中指定的這些索引。

當查詢形狀中存在一個索引過濾器時,MongoDB將會忽略 hint() 。如果您想瞭解MongoDB是否對一個查詢使用了索引過濾器,您可以檢查一下 explain() 輸出的 explain.filterSet 欄位。

索引過濾器只會影響到最佳化器評估的索引,最佳化器有可能會仍然選擇集合掃描作為某給定查詢形狀的優勝方案。

索引過濾器只存在於伺服器處理序中,在關機之後並不會儲存。MongoDB也提供了一個命令手動刪除過濾器。

由於索引過濾器重寫了最佳化器以及 hint() 方法預期的操作,請合理使用索引過濾器。

db.runCommand( 
  {   
      planCacheSetFilter: "orders",   
      query: { item: "ABC" },   
      projection: { quantity: 1, _id: 0 },   
      sort: { order_date: 1 },   
      indexes: [   
        { item: 1, order_date: 1 , quantity: 1 }   
      ]   
  }   
)

更多MongoDB相關內容可以看看以下的有用連結: 

MongoDB 3.0 正式版發布下載 

CentOS編譯安裝MongoDB

CentOS 編譯安裝 MongoDB與mongoDB的php擴充

CentOS 6 使用 yum 安裝MongoDB及伺服器端配置

Ubuntu 13.04下安裝MongoDB2.4.3

MongoDB入門必讀(概念與實戰並重)

Ubunu 14.04下MongoDB的安裝指南

《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

Nagios監控MongoDB分區叢集服務實戰

基於CentOS 6.5作業系統搭建MongoDB服務

MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡 

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.