Dex – MongoDB索引最佳化工具

來源:互聯網
上載者:User

Dex是一個開源的 MongoDB 最佳化工具,它通過對查詢日誌和當前資料庫索引進行分析,向管理員提出高效的索引最佳化策略。

快速入門安裝
pip install dex
開始監控
dex -f mongodb.log mongodb://localhost

在監控過程中,dex會通過stderr輸出推薦的結果

{"index": "{'simpleIndexedField': 1, 'simpleUnindexedFieldThree': 1}","namespace": "dex_test.test_collection""shellCommand": "db.test_collection.ensureIndex(  {'simpleIndexedField': 1, 'simpleUnindexedFieldThree': 1}, {'background': true})"}

還會輸出一些統計資訊

Total lines read: 7Understood query lines: 7Unique recommendations: 5Lines impacted by recommendations: 5

我們看到,在輸出結果中,有一個shellCommand欄位,裡面就是添加索引的語句,如果你覺得dex的推薦不錯,就可以直接複製這段指令碼在MongoDB上添加索引了。相當方便。

除了運行過程中會向stderr中輸出資訊名,在運行結束後,推薦資訊還會打包成一個大的JSON對象在stdout中輸出一次。

工作原理

Dex在運行過程中主要會進行下面三個步驟。

  1. 解析query
  2. 通過已存在的索引對當前query進行判斷
  3. 如果發現索引不當,就推薦合適的索引
第一步:解析query

Dex會對查詢query進行解析,分成下面幾大類

  • EQUIV – 普通按數值進行的查詢,比如:{a: 1}
  • SORT – sort操作,比如: .sort({a: 1})
  • RANGE – 範圍查詢,比如:Specifically: ‘$ne’, ‘$gt’, ‘$lt’, ‘$gte’, ‘$lte’, ‘$in’, ‘$nin’, ‘$all’, ‘$not’
  • UNSUPPORTED
    • 組合式查詢,比如:$and, $or, $nor
    • 除了RANGE之外的巢狀查詢
第二步:判斷當前索引情況

有兩個標準來找出查詢所需的索引。

  • Coverage (none, partial, full) - Coverage表示索引的情況,有括弧中的三個值。none表示完全無索引覆蓋。full表示query中的欄位都能找到索引。partial表示none和full之間的情況。
  • Order (ideal or not) - Order是用於判斷索引的順序是否理想。理想的索引順序應該是:
    Equivalence ○ Sort ○ Range
    值得注意的是,對地理位置索引只會進行分析,但是不會提出改進建議。
第三步:推薦合適的索引

通過上面兩步,我們能夠對一個查詢可能使用索引的情況有一個瞭解。Dex會產生一個此查詢的最佳索引。如果這個索引不存在,並且查詢情況不包括上面提到的UNSUPPORTED,那麼Dex就會做出相應的索引最佳化建議。

Dex未來還會推出很多新功能,比如使用system.profile日誌來進行推薦,支援地理索引等等。詳情可見其項目首頁。

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

相關文章

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.