為什么需要partitioned index filters
當(dāng)DB越來越大腾么, index/filter block
所占用的內(nèi)存越來越大亥揖,即使設(shè)置了參數(shù)cache_index_and_filter_blocks
(只把部分index/filter block放置在block cache中)珊擂, 占較大內(nèi)存的index/filter block
也會影響DB性能 1)占用本來用于緩存data block 的block cache 2 ) 在block cache獲取不到時圣勒,從磁盤上加載并加入到block cache中,這會增加系統(tǒng)負(fù)擔(dān)摧扇。
index/filter block會有多大
默認(rèn)情況下圣贸, 單個SST file會有一個index/filter block,index/filter的大小取決于配置扛稽,一般來說如果一個SST256MB吁峻, 那么index/filter block對應(yīng)的大小是0.5/5MB,這些明顯大于data-block(4-32k)在张。 如果index/filter能一直在memory中用含、在整個SST生命周期中只需讀一次, 這種是做好的帮匾。而不是和其他data block競爭block cache中的空間啄骇, 并且多次從磁盤上重新加載。
large index/filter的問題
在極端情況下瘟斜,如果index/filter block 放在block cache肠缔, index/filter block會和data cache無休止的競爭block cache的的內(nèi)存空間。 算一下: 一個5M的filter占用的空間可以緩存1000個data block(如果data block是4K)哼转,這會導(dǎo)致很多cache miss明未。 這些內(nèi)存占用大的index/filter很容易互相把對方踢出cache block從而導(dǎo)致自身的cache miss, 這也是為什么只有很少一部分的index/filter block會實際被用到壹蔓。
如果index/filter block被踢出cache趟妥,這些block需要從磁盤上被重新加載,并且這些大快的block 不能減少IO cost佣蓉。一個簡單的單個key的查找最多需要幾個data block 就行披摄, 但是這可能會導(dǎo)致加載大塊index/filter block, 如果這個頻繁發(fā)生勇凭,那么磁盤會有大量的時間都在服務(wù)于index/filter 塊疚膊,而不是實際的data block
什么是partitioned index/filters
簡單說來, 就是給index/filter分成小的block虾标,然后在這些block再加一級索引寓盗。 當(dāng)讀index/filte時, 只把頂層的index加入到內(nèi)存中璧函,在需要的時候傀蚌, 這些partitioned index/filter 利用頂層索引去定位小塊的index/filter block, 然后利用其的做index/filter query蘸吓。 這個頂層index 可以在heap中也可以由配置文件
參數(shù)cache_index_and_filter_blocks
決定
這種做法的優(yōu)點
- 高cache hit, 更細(xì)力度的控制index/filter, 更好的使用cache 空間
- 更少的I/O util 善炫,一旦發(fā)生了cache miss,只需要從磁盤讀少量的index
- 不需要向index/filter做妥協(xié): 沒有partition的時候库继,降低index/filter占用空間的方法是犧牲精度箩艺, 比如設(shè)置更大的data block size或者設(shè)置更少的bloom bit窜醉, 這樣就可以減少index/filters 的size。
這種做法缺點
- 更多的space: level-top index需要保存大約需要0.1-1%的index/filter size
- 更多的Disk IO: 如果top-level index 不在cache中艺谆, 需要直接去文件中讀榨惰, 這會可能需要更多的I/O, 為了避免這種額外I/O擂涛,top-level index可以被保存在heap中或者保存在高優(yōu)先級的cache中(高優(yōu)先級的cache也就是不會輕易被踢出cache)
- 喪失空間局部性: 如果a workload 需要頻繁且隨機(jī)的訪問一個SST文件读串, 那么在讀的時候會分別讀多個不同的index/filter partition, 相比于一次直接讀取整個index/filter撒妈, 效率低一些恢暖。其實可以禁止到L0/L1的top index。