目的:提公升插入效能;
使用插入緩衝的條件:
插入緩衝:change buffer是對insert buffer的加強,insert buffer只對insert有效,change buffer對insert、delete、update(delete+insert)、purge都有效;
change buffer作為buffer pool的一部分,innodb_change_buffering引數的值有:
innodb_change_buffer_max_size引數:控制使用的大小,預設25%,最大可設定50%,如果mysql例項中有大量的修改操作,可考慮增大該引數;
insert buffer的資料結構是一顆b+樹;
對滿足插入快取條件的插入,每一次的插入不是寫到索引頁中;
一定頻率進行合併操作,這個頻率有什麼條件?
doublewrite快取位於系統表空間的儲存區域,用來快取innodb的資料頁從innodb buffer pool中flush之後並寫入到資料檔案之前;
當作業系統或資料庫程序在資料頁寫入磁碟的過程中崩潰,可以在doublewrite快取中找到資料頁的備份,用來執行crash恢復;
資料頁寫入到doublewrite快取的動作所需要的io消耗要小於寫入到資料檔案的消耗,因為此寫入操作會以一次大的連續塊的方式寫入;
根據上圖知道:
記憶體中doublewrite buffer大小2m;物理磁碟上共享表空間中連續的128個頁,也就是2個區(extent)大小同樣為2m;
對緩衝池髒頁進行重新整理時,不是直接寫磁碟。
innodb儲存引擎會監控對錶上二級索引的查詢,如果發現某二級索引被頻繁訪問,此索引成為熱資料,建立hash索引以提公升查詢速度,此建立是自動建立雜湊索引,故稱為自適應雜湊索引(adaptive hash index);
自適應雜湊索引會占用innodb buffer pool;
只適合搜尋等值(=)的查詢,對於範圍查詢等操作,是不能使用的;
為了提高磁碟操作效能,當前的資料庫系統都採用非同步io的方式來處理磁碟操作。
非同步io:使用者可以在發出乙個io請求後立即再發出另外乙個io請求,當全部io請求傳送完畢後,等待所有io操作完成,這就是aio。與aio對應的是sync io,即每進行一次io操作,需要等待此次操作結束才能繼續接下來的操作。
非同步io的好處:
1、不用等待直接響應上乙個使用者的請求;
2、多次的請求在一起排序,請求的資料頁是在一起的,一次讀出來,減少多次讀。(資料庫的讀寫請求佇列放在檔案系統中單獨分配的一塊小記憶體結構裡,非檔案系統的快取)
當重新整理乙個髒頁時,innodb儲存引擎會檢測該頁所在區(extent)的所有頁,如果是髒頁,那麼一起進行重新整理。這樣做的好處顯而易見,通過aio可以將多個io寫入操作合併為乙個io操作,增大寫入量,減少了物理寫io,故該工作機制在傳統機械磁碟下有著顯著的優勢。
1、是不是可能將不怎麼髒的頁進行了寫入,而該頁之後又會很快變成髒頁?
2、固態硬碟有著較高的 iops,是否還需要這個特性?
為此,innodb 儲存引擎從 1.2.x 版本開始提供了引數 innodb_flush_neighbors,用來控制是否啟用該特性。對於傳統機械硬碟建議啟用該特性,而對於有著超高 iops 效能的固態硬碟,則建議將該引數設定為 0、即關閉此特性。
mysql InnoDB關鍵特性 重新整理鄰接頁
innodb儲存引擎還提供了flush neighbor page 重新整理鄰接頁 的特性。其工作原理為 當重新整理乙個髒頁時,innodb儲存引擎會檢測該頁所在區 extent 的所有頁,如果是髒頁,那麼一起進行重新整理。通過aio可以將多個io寫入操作合併為乙個io操作,故該工作機制在傳統機械磁...
MySQL InnoDB三大特性之 插入緩衝
innodb儲存引擎有三大特性非常令人激動,它們分別是插入緩衝 兩次寫和自適應雜湊,本篇文章先介紹第乙個特性 插入緩衝 insert buffer 非聚集索引寫效能問題 為了闡述非聚集索引寫效能問題,我們先來看乙個例子 mysql create table t id int auto increme...
MySQL InnoDB三大特性之 插入緩衝
非聚集索引寫效能問題 為了闡述非聚集索引寫效能問題,我們先來看乙個例子 mysql create table t id int auto increment,name varchar 30 primary key id 我們建立了乙個表,表的主鍵是id,id列式自增長的,即當執行插入操作時,id列會...