MongoDB***实践中文手册 (5)

MongoDB中索引和数据是同时更新的,保证在索引上的查询不会返回旧的数据或者删除的数据。模式设计的过程中就应该考虑如何设计合理的索引。MongoDB中默认情况下,索引的创建是个阻塞性操作。由于创建索引会消耗很多时间和资源,所以在复制集的主次节点上,索引的创建都可以在后台进行操作。当开启后台操作后,索引创建的总时间会比前台操作的时间要长一些,但是创建索引的过程任然可以对数据库进行查询操作。

一个通常的经验是,在前台创建索引,先在此节点上,再在降级的主节点上创建。这些过程在Ops Manager 和 Cloud Manager中可以自动实现。

除此之外,在后台可以同时创建多个索引。关于索引创建需要考虑的因素已经索引在线维护的更多信息,请参考Build Index on Replica Sets documentation。

在WiredTiger存储引擎中管理索引

所有的存储引擎都在支持MongoDB丰富的索引功能。使用WiredTiger时,有以下几个可供使用的优化意见:

l  WiredTiger默认会开启压缩功能以减少永久性存储和RAM上的索引占用。这使得管理员可以分配更多的工作集用来管理那些访问频率高的文档。压缩比率一般是50%左右,但是鼓励用户通过测试他们自己的工作负荷来确定实际的压缩比例。

l  管理员同样可以把索引放在单独的存储卷上,以带来更快的硬盘换页以及避免资产争夺。

索引限制

跟其他数据库系统一样,MongoDB中的索引也会占用硬盘空间以及消耗内存,所以需要的时候再用索引。索引会影响更新操作的性能。每个更新操作需要先定位到要修改的数据,这个时候就会使用索引,但是索引本身的维护也是需要开销的,这就会降低更新操作的性能。

部署MongoDB时有几个限制因素需要考虑:

l  一个文档最多只能建64个索引

l  索引不能超过2014比特

l  索引名字不能超过125个字母(包括命名空间)

l  没有索引的内存数据排序不能超过32M,这种操作很消耗CPU,内存数据排序***是创建索引来优化查询

索引的常见错误

下列的使用意见可以避免索引常见的问题:

使用混合索引而不用索引交叉:通过多个字段查询内容时,使用混合索引可以提供更好的性能。

混合索引:混合索引是通过字段来定义和排序的。所以,如果索引定义在last name、first name、city这三个字段上,查询last name或者查询last name和first name的时候就可以使用刚才创建的索引,但是,如果查询是基于city字段的,则使用刚才的索引并不会起到索引的效果。另一个经验是删除是其他所以前缀的索引。

低选择性索引:索引应该建立在那些选择范围比较大的字段上。例如,在性别这个字段上创建索引效果的不明显,不如把索引创建在zip代码或者电话号码这样的字段上。

正则表达式:索引是按照值来排序的,所以,前置通配符的效率并不高,还很可能导致全索引扫描。如果表达式中有足够多的区分大小写的字母,则使用后置通配符会更高效。

清除不必要的索引:索引会消耗很多资源,它们会占用RAM,字段的值更新时,相关联的索引也需要同时更新,就会导致额外的磁盘I/0消耗。使用$indexStats聚合状态可以决定索引使用的频率,从而查看每个索引的使用高效性。如果有些索引使用不到,就可以删除它以便减少磁盘占用并加快写入速度。在MongoDB Compass GUI中可以查看索引的使用情况。

偏重索引:如果一个索引只会被特定的一些文档使用到,则可以通过指定一个过滤条件为索引这是偏重选项。比如,如果一个定义在userId字段上的索引只是在查询未完成订单时才用到,那么,可以为它增加一个订单状态时正在交易中这样的条件。这样,偏重索引可以增加查询性能并减少系统负荷。

工作集

MongoDB会充分使用RAM以加速数据库操作。所有数据的读取和操作都是在内存中完成的。WiredTiger存储引擎使用内部缓存管理数据。MMAPv1使用内存映射文件。从内存中读取数据的时间是以纳秒来度量的,而从硬盘中读取数据的时间是以毫秒来度量的,从内存中读取数据的速度是从硬盘中读取数据的1000000多倍。

通过正常操作获取的数据集合索引叫做工作集。最理想的效果是所有的工作集都是在RAM中。有时候,工作集只代表整个数据的一部分,比如在最常访问的数据是最新以及最受欢迎的产品的应用中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgddzf.html