MongoDB - 读写性能
数据库请求流程
应用端
应用端视角里(MongoDB驱动程序与MongoDB进行交互),一次数据库请求流程如下:
- 选择节点
在复制集读操作里,选择节点会受readPreference
参数影响 - 排队等待
总连接数大于最大连接数maxPoolSize
,连接满了如何解决:优化查询性能,提高服务端资源等 - 连接与认证
等待创建连接和认证将比直接从连接池获取连接更耗时,所以应该设置minPoolSize
一次性创建足够的连接,避免突发的大量请求
数据库端
wiredTiger的ticket:大概有点像semaphore?
- 排队等待
ticket是和系统的资源相关的,增大ticket并不会优化排队等待,所以我们其实是需要优化CURD - 合并结果
在mongos进行结果合并,尽量使用带片键的查询条件减少参与查询的分片数
执行请求
读
执行请求(读)的具体过程如下图,造成性能问题的主要原因就是不能命中索引和内存排序。
写
执行请求(写),MongoDB默认是{j:false}
,即不用先刷盘,直接写内存缓存就能返回了,操作如下图:
- 磁盘速度必须比写入速度快才能保证(写频繁情况下的)性能
性能瓶颈总结
- 应用端:选择入口节;等待数据库连接;创建连接和完成认证
- 服务端:排队等ticket;执行请求;合并执行结果
- 网络:应用/驱动->mongos;mongos->片