Mysql InnoDB bufferpool
今博客一位朋友找到問這個問題,上網(wǎng)找出以下的解釋,希望能幫到他使用
問題:
發(fā)現(xiàn)在bufferpool用完后,insert完成后提交,select和update操作時數(shù)據(jù)如果不在bufferpool里,就需要從磁盤讀,這時insert或者update操作會執(zhí)行1s以上,導(dǎo)致那段時間的insert操作減少
innoDB在內(nèi)存中維護一個緩存池用于緩存數(shù)據(jù)和索引。緩存池管理一個數(shù)據(jù)塊列表,該列表又分為2個字列表,一個子列表存放new blocks,另一個子列表存放old blocks。old blocks默認(rèn)占整個列表大小的3/8(可通過innodb_old_blocks_pct改變默認(rèn)值,該值范圍在5-95之間,這是一個百分比),其余大小為new blocks占用。
當(dāng)有新數(shù)據(jù)添加到緩存池中時,如果緩存池的空間不足,則根據(jù)LRU算法清除數(shù)據(jù)。
-----重點解釋
新插入緩存池的數(shù)據(jù)插入到存放old blocks的子列表的頭部,如果數(shù)據(jù)被用戶訪問,則將這個數(shù)據(jù)移至new blocks的頭部。如果設(shè)置了innodb_old_blocks_time大于0,比如innodb_old_blocks_time=1000,當(dāng)新數(shù)據(jù)插入緩存池后過1s之后被訪問,才會把數(shù)據(jù)移至new blocks的頭部,在剛插入的一秒之內(nèi)被訪問改數(shù)據(jù)不會被移動,仍然在old blocks的頭部。
------
www.bitsCN.com
當(dāng)訪問old blocks中的數(shù)據(jù)時,該數(shù)據(jù)會被移至new blocks的頭部,但是當(dāng)訪問new blocks中的數(shù)據(jù)時,只有在該數(shù)據(jù)離new blocks的頭部有一定距離時才移動。
為了更好的并發(fā)性能,通過指定innodb_buffer_pool_instances(該值取值范圍為1-64)創(chuàng)建多個緩存池,每個緩存池的大小為
innodb_buffer_pool_size/innodb_buffer_pool_instances,通常需要保持當(dāng)個緩存池的大小大于1GB。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com