精通MongoDB-索引与查询优化

     索引是非常重要的东西,有了正确的索引,MongoDB才能高效地使用硬件,为应用程序提供快速的查询。错误的索引则会导致相反的结果:慢查询、无法充分利用硬件。显而易见,想要高效使用MongoDB的人都要理解索引。MongoDB索引的基础-B树数据结构。在下面的实践中,我们会讨论唯一性索引、稀疏索引和多键索引,为索引管理做些说明,随后,我们会深入研究查询优化,描述如何使用explain()和查询优化器。

1. 索引理论

     用户通常认为一个查询里要查询两个字段,可以针对它们分离索引。有一个现成的算法:查找每个索引里匹配项的页码,针对同时匹配两个索引的食谱扫描它们页码的并集。会有不少匹配不上的页码,但还是能减少扫描的总数。一些数据库实现了这个算法,但是MonggoDB中没有。就算它实现了,使用复合索引来查找两个字段总是会比刚才描述的算法更高效。记住,每个查询中数据库只会使用一个索引,如果要对多个字段进行查询,请确保有这些字段的复合索引。

    使用多个键的索引成为复合索引(compound index).索引能显著减少获取文档所需的工作量。没有合适的索引,实现查询的唯一途径就是线性扫描整个文档,知道满足查询条件为止,这通常是扫描整个集合。解析查询时只会使用一个单键索引。对于包含多个键的查询,包含这些键的复合索引能更好地解析查询。如果有ingredient-cuisine(食材-菜肴)索引,可以去掉ingredient索引。也就是说,如果有一个a-b复合索引,就可以去除a的单键索引。复合索引里键的顺序是很重要的。

1.1 核心索引概念

1.1.1 单键索引:单键索引的每一项都对应了被索引文档里的一个值。默认的_id索引就是一个很好的例子,由于这个字段上有索引,可以根据它快速地获取文档。

1.1.2 复合键索引:到目前为止,MongoDB中每个查询就使用一个索引。但是你经常需要对多个属性进行查询,希望这些查询都能高效一点。复合索引就是每一项都由多个键组合而成的索引。结合使用索引和查询时,有两件事要注意。第一,在索引里键的顺序很重要。第二就是明白为什么选择这样的顺序。一般来说,一个查询里有一项要精确匹配,另一项指定了一个范围。在使用复合索引时,范围匹配的那个键放在第二个位置上。

1.1.3 索引效率:索引对良好的查询性能涞水是必不可少的,但每个新索引都会带来一些小的维护成本。其原因是显而易见的,每当向集合添加文档时,都必须修改集合的所有索引,以加入新的文档。因此,如果一个集合上有10个索引,每次插入的时候都要做10次独立的结构修改。对于所有的写操作都是如此,无论是删除文档还是更新指定文档的索引键。

       对于读密集型应用而言,索引的成本一般都是合理的,你只要认识到索引还是会引入一定开销,必须谨慎选择即可。这意味着所有索引都被用到,没有一个索引时多余的。此处还有一个问题需要考虑:就算拥有正确的索引,但是还是有可能得不到快速的查询,索引和数据集无法全部放入内存时就会发生这种情况。

     MongoDB使用map()系统调用告诉操作系统将所有数据文件映射到内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值