MongoDB - 读写性能


数据库请求流程

应用端

应用端视角里(MongoDB驱动程序与MongoDB进行交互),一次数据库请求流程如下:
应用端

  • 选择节点
    在复制集读操作里,选择节点会受readPreference参数影响
  • 排队等待
    总连接数大于最大连接数maxPoolSize,连接满了如何解决:优化查询性能,提高服务端资源等
  • 连接与认证
    等待创建连接和认证将比直接从连接池获取连接更耗时,所以应该设置minPoolSize一次性创建足够的连接,避免突发的大量请求

数据库端

数据库端

wiredTiger的ticket:大概有点像semaphore?

  • 排队等待
    ticket是和系统的资源相关的,增大ticket并不会优化排队等待,所以我们其实是需要优化CURD
  • 合并结果
    在mongos进行结果合并,尽量使用带片键的查询条件减少参与查询的分片数

执行请求

执行请求(读)的具体过程如下图,造成性能问题的主要原因就是不能命中索引和内存排序

执行请求读

执行请求(写),MongoDB默认是{j:false},即不用先刷盘,直接写内存缓存就能返回了,操作如下图:
执行请求写

  • 磁盘速度必须比写入速度快才能保证(写频繁情况下的)性能

性能瓶颈总结

  • 应用端:选择入口节;等待数据库连接;创建连接和完成认证
  • 服务端:排队等ticket;执行请求;合并执行结果
  • 网络:应用/驱动->mongos;mongos->片


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM