MySQL的Change Buffer是指用于緩存InnoDB引擎中未落盤的更新操作的內(nèi)存區(qū)域,這樣可以減少磁盤IO的壓力,提高查詢性能。
當(dāng)InnoDB執(zhí)行完一條更新的操作,數(shù)據(jù)被寫入日志文件,但尚未持久化到磁盤上的數(shù)據(jù)緩存在Change Buffer中。因此,在后續(xù)的查詢請求中,如果需要訪問被更新的數(shù)據(jù),InnoDB可以首先從Change Buffer中查找數(shù)據(jù),而不是直接訪問磁盤,從而提高查詢速度。
當(dāng)系統(tǒng)有較多的更新請求時,Change Buffer可以事半功倍。因?yàn)槎鄠€更新操作可以在內(nèi)存中緩存起來,一次性寫入磁盤,減少IO的次數(shù)。因此,特別適合于高并發(fā)、寫入頻繁的場景。
當(dāng)InnoDB的緩存池(Cache Pool)被大小超出時,系統(tǒng)將自動調(diào)整Change Buffer的大小。可以通過以下參數(shù)控制Change Buffer大小:
innodb_change_buffer_max_size innodb_change_buffering
其中,innodb_change_buffering可以設(shè)置三種取值:
innodb_change_buffering=none // 關(guān)閉Change Buffer功能 innodb_change_buffering=inserts // 僅緩存插入操作到Change Buffer innodb_change_buffering=all // 緩存所有更新操作到Change Buffer
需要注意的是,Change Buffer只能緩存單表的數(shù)據(jù)更新,在多表Join查詢中,Change Buffer并不生效。如果涉及到多表的更新操作,建議采用批量更新方式,或者將更新操作盡量分散,減少大量的IO操作。