鍍金池/ 問答/數(shù)據(jù)庫/ 假如數(shù)據(jù)都加載到內(nèi)存中 count會變快嗎?

假如數(shù)據(jù)都加載到內(nèi)存中 count會變快嗎?

問題

查看mongodb的慢查詢?nèi)罩?發(fā)現(xiàn)有好多count慢查詢 最長的有半分鐘

解決方案

不想添加一大堆索引(如文章標(biāo)題 文章平臺 賬號 情感 等等) 如果單純增加內(nèi)存(如由 32GB ==> 128GB) 是否可以加快count的查詢性能呢? 即如果數(shù)據(jù)都加載到內(nèi)存中 count是否會更快呢(即使沒有索引)?

當(dāng)前一些指標(biāo):

當(dāng)前數(shù)據(jù)量:20GB
服務(wù)器內(nèi)存大小: 32GB
db.serverStatus().wiredTiger.cache
"bytes currently in the cache" : 8458332579
"maximum bytes configured" : 11811160064

db.serverStatus().mem
{
    "bits" : 64,
    "resident" : 11327,
    "virtual" : 13123
}



回答
編輯回答
巫婆

簡單的答案:不行
內(nèi)存對數(shù)據(jù)庫的作用是不可忽略的,但是你似乎夸大了它的作用。這樣考慮:
假設(shè)你有100w條數(shù)據(jù),需要從中按一定的條件來count。如果沒有索引,你需要進(jìn)行100w次比較,看其中有哪些是滿足條件的數(shù)據(jù),然后計(jì)數(shù)。為了進(jìn)行這個(gè)比較,首先要把數(shù)據(jù)從磁盤上撈出來吧,擴(kuò)大內(nèi)存確實(shí)對這方面有幫助,但是然后呢?比較100w條數(shù)據(jù)是不是要消耗很多時(shí)間?CPU是不是也會漲很高?這就是O(n)的時(shí)間復(fù)雜度。
如果能完整命中索引,這個(gè)過程將大大簡化,因?yàn)閷?shù)據(jù)的搜索可以想象為折半查找,其復(fù)雜度為O(log2(n))。兩者的時(shí)間消耗大概是這樣(橫坐標(biāo)數(shù)據(jù)量,縱坐標(biāo)時(shí)間):
https://i.stack.imgur.com/7eh...
clipboard.png

簡單地說,在同樣的硬件條件下:

  • 如果沒有索引支持,數(shù)據(jù)量越多需要的時(shí)間越長
  • 而完整命中索引時(shí)理論上數(shù)據(jù)量增長并不會造成消耗的時(shí)間顯著增長
2018年9月4日 15:24