背景交代: 1 MongoDB 有 500 万条数据
2 经过过滤 还有 20 多万条数据
要得到上述 20w 条数据, 一次查询得到 20 多万条, 很可能会产生性能问题, 于是同事用 for 循环, 每次查询 1000 条数据, 下一次 skip 1000 条, take 1000 条. 导致性能及其低下, 早上请求, 下午才获得完整数据.
解决方法思路是将 1000 改成 5000
原因:
第一次 取 1000
第二次 先数完前 1000 行 再取 1000
第三次 先数完前 2000 行 再取 1000
...
第二百次 数完 199000 再取 1000
这样数了 (1000+199000)+(2000+198000)+...=100*200000=2000 0000 次 = 两千万次
如果是 5000 的话
数了 40/2*5000=20*5000=10 0000 = 十万次
两者相差 200 倍
这是比较的数行数的差距, 另外读数据到内存, 每次 1000 行得到的 list 要 union 200 次, 每次 5000 行得到的 list 要 union40 次.
5000 是举的例子, 在不发生内存异常的情况下 我觉得越大越好
来源: http://www.bubuko.com/infodetail-2880000.html