一般地,SequoiaDB 会自动生成访问计划决定查询是否使用索引扫描,以及使用哪个索引去扫描。如果需要指定索引来进行查询,可以使用SdbQuery.hint()接口完成。如,在 sample.employee
集合上指定 idIdx 索引来查询 id 为 999 的记录。
db.sample.employee.find({ 'id': 999 }).hint({ '': 'idIdx' })
如需查看索引使用情况,可以使用 SdbQuery.explain()。ScanType 字段为 ixscan 说明使用了索引,否则,ScanType 为 tbscan。在 IndexName 字段中可以查看所使用的是哪个索引。
> db.sample.employee.find({ 'id': 999 }).explain()
{
"NodeName": "sdbserver:11740",
"GroupName": "group1",
"Role": "data",
"Name": "sample.employee",
"ScanType": "ixscan",
"IndexName": "idIdx",
"UseExtSort": false,
"Query": {
"$and": []
},
"IXBound": {
"_id": [
[
{
"$minElement": 1
},
{
"$maxElement": 1
}
]
]
},
"NeedMatch": false,
"ReturnNum": 0,
"ElapsedTime": 0.000052,
"IndexRead": 0,
"DataRead": 0,
"UserCPU": 0,
"SysCPU": 0
}
访问计划使用索引的决策决定于集合的统计信息。分析集合和索引的数据,有助于生成更高效的访问计划。收集统计信息请使用Sdb.analyze()。
删除索引
如需删除无用的索引,可以参考SdbCollection.dropIndex()接口。例如,删除集合 sample.employee
中名为 idIdx 的索引:
db.sample.employee.dropIndex('idIdx')
基本原理
创建索引时,数据库会将指定字段的值拷贝到一个数据结构索引项中,并对其进行排序。使用索引查询时,数据库会从索引中找到满足条件的索引项,然后根据索引项中记录的位置信息,找到完整的记录。从而实现高效的查询。索引项是以 B 树的形式组织的,因此使用树的遍历可以快速地找到满足条件的索引项。
图 1 中,对集合中的 id 字段建立了索引。查询 id = 5 的记录。流程如红色线所示。
该查询分为以下几个步骤:
- 找到 id 字段对应的索引
- 在索引中,通过遍历 B 树的方式,找到符合条件的索引项
- 通过索引项中记录的位置信息,找到完整的记录,并返回
- 查询完成
相关阅读