MongoDB性能优化——优化技巧


  • Lv 1

    1、尽量减少磁盘访问

    • 内存访问要比磁盘访问快得多,所以使用优化的本质就是尽可能地减少对磁盘的访问。内存的读取速度要比磁盘速度快很多;读磁盘要消耗很长时间,所以使用SSD(固态硬盘)或者增加内存可以减少对硬盘的读取。

    2、使用索引减少内存占用

    • 索引是有序的,字段后面的1 表示升序,-1 表示降序,当查询中用到某些条件时,可以对该键建立索引,以提高查询速度,所以不必遍历全部项。当查询时候会先根据索引查到索引中的结果,然后符合条件的文档加载到内存中,从而减少内存占用。

    3、不要到处使用索引

    • 不是创建索引越多性能优化就越好,不是所有的查询都可以用索引的,索引一般用在返回的查询结果只是总体数据的一小部分的时候,一般情况下,返回查询结果超过整个集合一半数据,就建议不要使用索引了。另外,当集合创建后,系统会自动创建一个id的索引,这个是无法被删除与更名的。

    • 若已对某个字段建立了索引,又想在模糊查询时候不使用它(因为使用时候可能较低效)可以使用自然排序,用{“$natural”:1}来强制禁用索引。自然排序就是“按照磁盘上的存储顺序返回数据”,这样MongoDB就不会使用索引。

    4、索引覆盖查询

    • 如果只想返回某些字段且所有这些字段都可放在索引中,可以做索引覆盖查询(covered index query),这种查询不会访问指针指向的文档,而是直接用索引的数据返回结果。

    • 例如:

    db.employee.createIndex({x:1, y :1,z:1})
    
    • 现在查询被索引的字段,并只要求返回这些字段,就没必要加载整个文档:
    db,employee.find({x: ceriteria, y: ceriteria})
    

    5、使用复合索引加快多个查询

    • 查询的时候,只要和索引匹配的话,就能够利用索引;所以创建索引时要考虑这些查询依赖的所有字段,并且根据各个字段查询的频率定义索引字段顺序

    6、AND 和 OR 类型查询要点

    • 假设要查询满足条件A,B和C的文档,满足A的文档有4万,满足B的有9K,满足C的是200,那么应该用C and B and A 这样只需要查询200条记录

    • OR型查询与AND查询恰好相反,匹配最多的查询语句放在最前面,也就是A or B or C这样

    7、小结

    • 所以一个索引的好坏直接影响着查询的性能,我们要创建合适索引才能够真正优化性能。也不是说创建越多的索引就越好,索引多同样会给数据库的负载带来一定的影响,在满足系统资源分配的情况下,创建索引越少越好。

登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待