Skip to content

Latest commit

 

History

History
33 lines (22 loc) · 2.03 KB

MongoDB-besides-index.md

File metadata and controls

33 lines (22 loc) · 2.03 KB

索引该加的都加了,还不够快。怎么办?

(前文)[https://github.com/no7dw/no7dw.github.io/blob/master/source/_posts/MongoDB-Best-Proactices-About-Index.md] 末尾提及过这个 索引该加的都加了,还不够快。怎么办?

首先 不是建立了index 就完事了. 写query 要注意:

  • table size
  • growing trend
  • cardinality (稀疏问题)

然后决定index的选择。

另外不是DB 每次都会选择到最优的索引,要跟进自己的实际情况去挑选(如果DB的winning plan 非最佳),使用 hint 来指定索引.

再次 遇到过几种case:

  • 每次从DB拿部分数据,不断for loop step ,skip & limit. -- 为了避免每次拿太多数据
  • or 定时任务, 每次从DB拿部分数据进行处理 。(例子每1 或 5分钟,拿 {status: pending} 的order 与第三方进行check 状态,以保证协调状态的一致)

这些可以考虑是读DB 数据到cache (redis or mq), 数据推送到DB同时更新到cache。 -- 目的是为了减少DB的查询,减少DB 查询的量(次数&取的数据量)

注意large skip limit 对DB 是有害的。参考 其他文章google 为什么不做很大的分页查询。 DB large skip bad to use large skip limit 取巧法

还碰到过,为了显示类似阅读量,销售量,每次详情、摘要,都要过来查count !!! -- 真的十分大压力。 典型做法:

  • 另外保存一个计数器,而不在原始记录里面count
  • 存在cache中 $inc,而不再DB层进行count (原始记录写没问题)
  • 粗算法,很多业务其实不需要精确的给用户,销售量 12,345 跟 12,344 对买家是没有区别的。(但对卖家有区别, 但两者对应系统不一样了)。想想 微信阅读数 10万+ , 1.4万 的显示,而非直接显示阅读数。