Mysql InnoDB bufferpool
今博客一位朋友找到問這個問題,上網找出以下的解釋,希望能幫到他使用
www.2cto.com
問題:
發現在bufferpool用完後,insert完成後提交,select和update操作時數據如果不在bufferpool裡,就需要從磁盤讀,這時insert或者update操作會執行1s以上,導致那段時間的insert操作減少
innoDB在內存中維護一個緩存池用於緩存數據和索引。緩存池管理一個數據塊列表,該列表又分為2個字列表,一個子列表存放new blocks,另一個子列表存放old blocks。old blocks默認占整個列表大小的3/8(可通過innodb_old_blocks_pct改變默認值,該值范圍在5-95之間,這是一個百分比),其余大小為new blocks占用。
當有新數據添加到緩存池中時,如果緩存池的空間不足,則根據LRU算法清除數據。
-----重點解釋
新插入緩存池的數據插入到存放old blocks的子列表的頭部,如果數據被用戶訪問,則將這個數據移至new blocks的頭部。如果設置了innodb_old_blocks_time大於0,比如innodb_old_blocks_time=1000,當新數據插入緩存池後過1s之後被訪問,才會把數據移至new blocks的頭部,在剛插入的一秒之內被訪問改數據不會被移動,仍然在old blocks的頭部。
------
www.2cto.com
當訪問old blocks中的數據時,該數據會被移至new blocks的頭部,但是當訪問new blocks中的數據時,只有在該數據離new blocks的頭部有一定距離時才移動。
為了更好的並發性能,通過指定innodb_buffer_pool_instances(該值取值范圍為1-64)創建多個緩存池,每個緩存池的大小為
innodb_buffer_pool_size/innodb_buffer_pool_instances,通常需要保持當個緩存池的大小大於1GB。