Home >Database >Mysql Tutorial >Dex – MongoDB索引优化工具

Dex – MongoDB索引优化工具

WBOY
WBOYOriginal
2016-06-07 17:15:491229browse

通过上面两步,我们能够对一个查询可能使用索引的情况有一个了解。Dex会生成一个此查询的最佳索引。如果这个索引不存在,并且查询

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: 7 Understood query lines: 7 Unique recommendations: 5 Lines impacted by recommendations: 5

我们看到,在输出结果中,有一个shellCommand字段,里面就是添加索引的语句,,如果你觉得dex的推荐不错,就可以直接复制这段脚本在MongoDB上添加索引了。相当方便。

除了运行过程中会向stderr中输出信息名,在运行结束后,推荐信息还会打包成一个大的JSON对象在stdout中输出一次。

工作原理

Dex在运行过程中主要会进行下面三个步骤。

  • 解析query
  • 通过已存在的索引对当前query进行判断
  • 如果发现索引不当,就推荐合适的索引
  • 第一步:解析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的下载地址:请点这里

    linux

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn