1. 程式人生 > >MySQL 資料庫的提速器-寫快取(Change Buffer)

MySQL 資料庫的提速器-寫快取(Change Buffer)

寫快取(Change Buffer) 是一種特殊的資料結構,用於在對資料變更時,如果資料所在的資料頁沒有在 buffer pool 中的話,在不影響資料一致性的前提下,InnoDB 引擎會將對資料的操作快取在 Change Buffer 中,這樣就省去了從磁碟中讀入這個資料頁。

將資料頁從磁碟讀入記憶體中涉及隨機 IO 訪問,這也是資料庫裡面成本最高的操作之一,而利用寫快取(Change Buffer)可以減少 IO 操作,從而提升資料庫效能。

關於 MySQL 寫快取(Change Buffer),我們先來看看 InnoDB 的技術架構圖:

Change Buffer 是 Buffer Pool 中的一部分,雖然 Change Buffer 名字叫 Buffer ,但是它也是可以持久化的,在右邊的 System Tablespace 中可以看到持久化 Change Buffer 的空間。觸發寫快取(Change Buffer)持久化操作有以下幾種情況:

  • 1、資料庫空閒時,後臺有執行緒定時持久化
  • 2、資料庫緩衝池不夠用時
  • 3、資料庫正常關閉時
  • 4、redo log 寫滿時

再單獨看看 Change Buffer 的架構圖,如下所示:

圖中詳細的描述了 Change Buffer 的功能,Change Buffer 中的資料最終還是會刷回到資料所在的原始資料頁中,Change Buffer 資料應用到原始資料頁,得到新的資料頁的過程稱之為 merge。merge 過程中只會將 Change Buffer 中與原始資料頁有關的資料應用到原始資料頁,以下三種情況會發生 merge 操作:

  • 1、原始資料頁載入到 Buffer Pool 時。
  • 2、系統後臺定時觸發 merge 操作。
  • 3、MySQL 資料庫正常關閉時。

Change Buffer 的相關設定

上面就是寫快取(Change Buffer)的相關知識,寫快取(Change Buffer)我們也是可以使用命令引數來控制,MySQL 資料庫提供了兩個對寫快取(Change Buffer)的引數。

1、innodb_change_buffer_max_size

innodb_change_buffer_max_size 表示 Change Buffer 最大大小佔 Buffer Pool 的百分比,預設為 25%。最大可以設定為 50%。

2、innodb_change_buffering

innodb_change_buffering 引數用來控制對哪些操作啟用 Change Buffer 功能,預設是:all。innodb_change_buffering 引數有以下幾種選擇:

--all:      預設值。開啟buffer inserts、delete-marking operations、purges
--none: 不開啟change buffer
--inserts:  只是開啟buffer insert操作
--deletes:  只是開delete-marking操作
--changes:  開啟buffer insert操作和delete-marking操作
--purges:   對只是在後臺執行的物理刪除操作開啟buffer功能

對上面寫快取(Change Buffer)如果你還是雲裡霧裡的話,那麼我們就用一個案例來說明一下 Change Buffer ,首先我們向資料庫中插入兩條資料:

mysql> insert into t(id,k) values(id1,k1),(id2,k2);

結合下面這張圖來分析這兩條插入語句。

假設當前是 K索引樹的狀態,K1 所在的資料頁 page1 在 Buffer Pool 中,k2 所在的資料頁不在 Buffer Pool 中,來看看這兩條語句的執行流程:

1、對於 k1 這條資料,Page 1 在記憶體中,所以直接更新記憶體,不會使用到 Change Buffer;

2、k2 對應的資料頁 Page 2 沒有在記憶體中,就在記憶體的 change buffer 區域,記錄下“我要往 Page 2 插入一行”這個資訊,這個地方及其關鍵,並沒有從磁碟中將 page2 載入到記憶體。

3、將上述兩個動作記入 redo log 中(圖中 3 和 4)。

4、後臺執行緒會定時將 page1 和 Change Buffer 中的資料持久化

主要地方在於步驟二,這就是寫快取(Change Buffer)提高效能的地方,雖然 page2 並沒有在記憶體中,但是並沒有妨礙我們往資料庫 page2 中插入資料,這就是寫快取(Change Buffer)的巧妙之處,也是寫快取(Change Buffer)提高 MySQL
的地方。

Change Buffer 適用場景

Change Buffer 並不是適用於所有場景,以下兩種情況不適合開啟 Change Buffer :

  • 1、資料庫都是唯一索引

如果資料庫都是唯一索引,那麼在每次操作的時候都需要判斷索引是否有衝突,勢必要將資料載入到快取中對比,因此也用不到 Change Buffer。

  • 2、寫入一個數據後,會立刻讀取它

寫入一個數據後,會立刻讀取它,那麼即使滿足了條件,將更新先記錄在 change buffer,但之後由於馬上要訪問這個資料頁,會立即觸發 merge 過程。這樣隨機訪問 IO 的次數不會減少,反而增加了 change buffer 的維護代價。所以,對於這種業務模式來說,change buffer 反而起到了副作用。

以下幾種情況開啟 Change Buffer,會使得 MySQL 資料庫明顯提升:

  • 1、資料庫大部分是非唯一索引
  • 2、業務是寫多讀少
  • 3、寫入資料之後並不會立即讀取它

總體來說 InnoDB 的寫快取(Change Buffer)應用得當,會極大提高 MySQL 資料庫的效能,使用不恰當的話,可能會適得其反。

以上就是今天分享的內容,希望對您的學習或者工作有所幫助,如果您覺得文章不錯,歡迎點個贊和轉發,謝謝。

最後

目前網際網路上很多大佬都有 MySQL 相關文章,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公眾號:「網際網路平頭哥」,和平頭哥一起學習,一起進步。

相關推薦

MySQL 資料庫提速-快取Change Buffer

寫快取(Change Buffer) 是一種特殊的資料結構,用於在對資料變更時,如果資料所在的資料頁沒有在 buffer pool 中的話,在不影響資料一致性的前提下,InnoDB 引擎會將對資料的操作快取在 Change Buffer 中,這樣就省去了從磁碟中讀入這個資料頁。 將資料頁從磁碟讀入記憶體中涉及

MySQL資料庫的基本操作-建立create database、選擇use、檢視shows database、刪除drop database

一、MySQL概述 MySQL是目前最流行的開源資料庫,是完全網路化的跨平臺關係型資料庫系統,尤其與PHP,被稱為黃金組合。 MySQL的特點: 1、功能強大。 2、支援跨平臺。 3、執行速度快。 4、支援面向物件。 5、安全性高。 6、成本低。 7、支援各種語言開發。 8、資料庫儲存容

mysql資料庫全備和全備還原使用Xtrabackup

一、使用innobackupex建立全備 語法 innobackupex --user=DBUSER --password=DBUSERPASS /path/to/backup/dir/ innobackupex --user=DBUSER --password=DBUSERPASS --backup --t

MYSQL資料庫簡單的狀態檢查show status

show processlist可以檢查mysql當前sql語句的執行情況,而show status就可以檢查mysql當前的狀態 命令:show status(PS:可以通過like來過濾一些不必要的資訊) 這個命令返回的資訊相當之多,一共返回了291行資訊(不用版本可能

Spring Boot2.0.3 Mybatis Sharding-jdbc3.X整合實現資料庫的讀分離MySql的主從配置

Mysql的安裝 這個網上一大堆的教程,我這裡安裝的mysql5.7。這裡就不細說了,直接貼相應的命令 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm yum locali

MySQL Proxy 讀分離實戰總結

mysql proxy;讀寫分離 規劃: 主mysql服務器:192.168.1.21 從mysql服務器: 192.168.1.22 mysql讀寫分離器:192.168.1.23 1、讀寫分離服務器上解壓安裝包,並添加對應用戶,並編輯啟動腳本; # tar xf mysql-proxy-

MMM架構實現MySQL高可用讀分離進階版,包含Amoeba

meid _id status mysqld 服務無法啟動 flush 忽略 kit pri 前兩天逛博客偶然發現了某大神寫的關於MMM的文章,看完就迫不及待的自己試了一下,大神寫的很順暢,以為自己也能操作的很順暢,但是實際情況是手腳太不麻利,碰到很多坑,如果大神的

六天帶你玩轉mysql資料庫-- 第三天筆記

資料的高階操作: 資料操作:增刪改查 新增資料: 基本語法: insert into 表名 [(欄位列表)] values(值列表); 在資料插入的時候,假設主鍵對應的值已經存在,插入一定會失敗。 主鍵衝突: 當主鍵存在衝突的時候(Duplicate ke

六天帶你玩轉mysql資料庫--第三天筆記

索引: 幾乎所有的索引都是建立在欄位之上。 索引:系統根據某種演算法將已有的資料(未來可能新增的資料),單獨建立一個檔案,檔案能夠實現快速的匹配資料, 並且能夠快速的找到對應表中的記錄。索引的意義在於: 1.提升查詢資料的效率 2.約束資料的有效性(唯一性等) 增加索引有前提條件:索引本

六天帶你玩轉mysql資料庫--第三天筆記

回顧: 欄位型別(列型別):數值型,時間日期和字串型別。 數值型:整數和小數型(浮點型和定點型) 時間日期型:datetime,date,time,timestamp,year。 字串型別:定長,變長,文字字串(text和blob),列舉(單選)和集合(多選)。 mysql的 記錄長度:

六天帶你玩轉mysql資料庫--第五天筆記

回顧: 連線查詢:多張表連線到一起,不管記錄數如何,欄位數一定會增加。 分類:內連線,外連線,自然連線和交叉連線。 交叉連線:cross join(笛卡爾積) 內連線:inner join,左右兩張表中有連線條件匹配(不忽略的匹配) 外連線:outer [left/righ

用sql語句操作mysql資料庫的增刪改查命令提示符和引入mysql模組兩種方式

1:命令提示符方法: 我的 :mysql.sql檔案。當然首先得開啟本地伺服器(我的是xampp); 少了一步了:首先要在進入mysql -h127.0.0.1 -u root -p;後引入我的mysql.sql 檔案; 我用的是 source方法:  source

CentOS下修改mysql資料庫編碼為UTF-8mysql開啟遠端連線和開放3306埠

樓主在配置好linux雲伺服器的jdk,tomcat,mysql後,當要開始部署專案是,突然意識到一個很嚴重的問題,那就是資料庫的編碼問題,自安裝完成後並未修改資料庫的額編碼。。。。下面就來說說linux下修改mysql的編碼問題吧。。有一個問題網上很多地方都沒說到,詳情請繼續往下看。

mysql資料庫實現讀分離

1.mysql讀寫分離背景 在專案中使用mysql資料庫,所有的增刪改查操作都在主庫處理,隨著查詢訪問量的增加,單庫處理的壓力驟增,為了防止主庫故障,使用一主多從的方式,通過讀寫分離,把所有的查詢處理都放到從伺服器上,減少單點故障導致整個服務掛掉的情況。 2.mysql讀寫分離的實現

基於ajax+php+mysql資料庫實現使用者註冊登入

轉至https://blog.csdn.net/hjw453321854/article/details/78810979 1.註冊登入介面: form.html     <html> <meta content="

Linux下安裝Mysql資料庫且給使用者授權安裝包安裝

第一步:查詢原有的資料庫 #rpm -qa|grep -i mysql 第二步:刪除查詢出來的資料庫 #rpm -e packageName  --nodeps

SSH框架結合MySql資料庫實現常用小專案名片系統、商品管理、商品推薦、登陸註冊

概述        這裡主要使用hibernate3.0、struts2.0和spring框架結合mysql資料庫搭建的開發環境,實現了幾個在開發學習中常用到的功能,名片系統、商品管理、商品推薦、登陸註冊、css結合js簡單優化頁面

MySQL 資料庫備份和恢復探討全量mysqldump 和 增量mysqlbinlog

背景介紹: 在開發、測試以及生產環境中,每次修改MySQL資料庫,嚴格上來說,都應該事先備份資料庫,以便修改錯誤後導致資料庫掛掉或者不能用,能夠及時還原為修改前的資料庫;另外,在實際使用中也可能因為不正確的使用MySQL資料庫,導致資料庫不可用。因此,做好MySQL資料庫的備份和恢復具有重要的意

MySQL資料庫安裝和常用操作

檢查Linux系統中是否已經安裝了MySQL,輸入命令嘗試開啟MySQL服務: sudo service mysql start 如果提示是這樣的,則說明系統中沒有 MySQL,需要繼續安裝: mysql: unrecognized service 在Ubuntu上安裝MySQL,最

MySQL 資料庫效能優化之快取引數優化

https://blog.csdn.net/truelove12358/article/details/51956356   部落格 學院 下載 圖文課 論壇 APP 問答 商城 VIP會員 活動 招聘 ITe