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