跳至主要內容

MongoDB 缓存测试

Mr.陈前端mongodb大约 2 分钟约 663 字

MongoDB 缓存测试

🍀 文章的主要内容是通过设置 --wiredTigerCacheSizeGB 控制缓存的大小,测试不同的缓存大小对查询速度的影响

参数说明

--wiredTigerCacheSizeGB arg

Maximum amount of memory to allocate for cache; Defaults to 1/2 of physical

为缓存分配的最大内存量;默认为物理值的 1/2(也就是我 windows 电脑的的 1/2,最小值为 0.25

1 造数据

使用 mockjs 生成 100 万条数据,插入到 MongoDB 中,并测试查询速度和内存占用情况。

1.1 创建测试项目

#初始化项目
pnpm init
#安装以来
pnpm install mockjs mongodb
#编写脚本
touch index.js
#运行脚本
node index.js

1.2 编写 nodejs 脚本

const Mock = require('mockjs');

/**
 * id:自增
 * name:姓名
 * email:邮箱
 * age:年龄
 * address:地址
 * intro:个人说明
 * createTime:创建时间
 */
const data = Mock.mock({
  'list|1000000': [
    {
      id: '@increment',
      name: '@cname',
      email: '@email',
      age: '@natural(18, 80)',
      address: '@county(true)',
      intro: '@cparagraph',
      createTime: '@datetime',
    },
  ],
});

// 需要使用mongosh先创建用户
// db.createUser({user: "root", pwd:  "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )

const { MongoClient } = require('mongodb');
const uri = 'mongodb://root:123456@127.0.0.1:27017';
const client = new MongoClient(uri);

// 库名
const dbName = 'test';

async function main() {
  await client.connect();
  console.log('创建连接: ' + new Date().toLocaleString());
  const db = client.db(dbName);
  const collection = db.collection('users');

  // 插入数据
  await collection.insertMany(data.list);

  return '插入完成: ' + new Date().toLocaleString();
}

main()
  .then(console.log)
  .catch(console.error)
  .finally(() => client.close());

这里创建了 100 万条数据,占用空间 343 兆

2 插入操作测试

每次插入数据时重启 mongodb

2.1 未配置参数插入测试

2.2 配置参数插入测试

--wiredTigerCacheSizeGB 0.25

注意

可见影响并不大

3 查询操作测试

查询语句:

db.users.find({ address: { $regex: '^江西.*$' } }).explain('executionStats');

指标说明:

  • nReturned:查询返回文档数
  • executionTimeMillis:查询耗时
  • totalDocsExamined:集合总共文档数

3.1 未配置参数查询测试

第一次查询

  executionStats: {
    executionSuccess: true,
    nReturned: 29555, //查询返回文档数
    executionTimeMillis: 1106, //查询耗时
    totalKeysExamined: 0,
    totalDocsExamined: 1000000 //集合总共文档数
  }


 
 

 

第二次查询

  executionStats: {
    executionSuccess: true,
    nReturned: 29555,
    executionTimeMillis: 618,
    totalKeysExamined: 0,
    totalDocsExamined: 1000000,
  }


 
 

 

注意

可以看到时间变快了,猜测可能和缓存有关

查询完成后,查看 mongodb 内存占用

3.2 配置参数查询测试

--wiredTigerCacheSizeGB 0.25

第一次查询

  executionStats: {
    executionSuccess: true,
    nReturned: 29555,
    executionTimeMillis: 1083,
    totalKeysExamined: 0,
    totalDocsExamined: 1000000,
  }


 
 

 

第二次查询

  executionStats: {
    executionSuccess: true,
    nReturned: 29555,
    executionTimeMillis: 5913,
    totalKeysExamined: 0,
    totalDocsExamined: 1000000,
  }


 
 

 

第三次查询

  executionStats: {
    executionSuccess: true,
    nReturned: 29555,
    executionTimeMillis: 6971,
    totalKeysExamined: 0,
    totalDocsExamined: 1000000,
  }


 
 

 

注意

可以看到缓存大小的改变,对查询的速度影响很大

查询完成后,查看 mongodb 内存占用