如何通过SQL优化来提升实例性能 Hash 索引 如果只涉及到对单个字段的等值查询,可以考虑创建 hash 索引,使用 mongo shell 创建 hash 索引的方式如下: db.coll.createIndex({score: "hashed"}) Hash 索引底层也是使用 btree 存储,但是区别在于 btree 的 key 是 hash 之后的值。 对于分片版本的文档数据库实例,如果按照 hash 方式创建分片表,则每个 shard server 上会自动创建基于分片键的 hash 索引。 Hash 索引有一些限制: 不能指定唯一属性。 不能进行范围扫描。 如果要创建索引的字段很长,由于 hash 索引是按照的 64bit 的hash 值创建索引,可以在一定程度上节省索引的存储空间。 索引属性 在创建索引时可以指定属性完成更高级的功能,常用的配置属性有: TTL 。实现数据自动过期删除。比如有 coll 表中存放了系统运行日志,其中包含了 createTime 指定了日志生成时间,则可以按照这个字段创建 TTL 索引自动删除 1 个小时以前的数据:db.coll.createIndex( { "createTime": 1 }, { expireAfterSeconds: 3600 } )。 Unique。指定字段的唯一性。如果重复插入该字段值相同的数据会报错失败,指定方式为 db.coll.createIndex( { "name": 1 }, { unique: true } )。 Partial。只对满足条件的文档创建索引。比如只对分数大于 80 的文档创建索引:db.coll2.createIndex({score:1, name:1}, {partialFilterExpression: {score: {$gt: 80}} })。 慢查询定位和处理 用户可以在控制台上单机实例名称进入慢日志展示页面,查看实例最近的慢请求。慢日志中一般会包含 docsExamined 等信息记录了本次请求扫描的文档数,可以结合日志信息和查询语句来判断是否缺少合适的索引。 用户也可以使用 mongo shell 连接到文档数据库服务实例,然后执行 explain() 观察查询计划是否复合预期。例如: db.coll.find({xxx:xxx}).explain() 如果缺少索引,可以执行前文所述的命令进行索引创建,然后重新执行查询命令观察执行计划是否正常。