你插入MySQL的資料真的存到表裡了麼?

2021-10-05 13:16:17 字數 2325 閱讀 2005

現在有這麼乙個問題:當你執行一條insert語句之後,插入的資料就已經儲存在磁碟中了麼?

答案是不一定 ,那是為什麼呢?首先來了解一下mysql在innodb儲存引擎中,資料是怎麼儲存的。

1. innodb資料儲存單元

同大多數資料庫一樣,innodb有頁(page)的概念(也可以稱為塊),頁是innodb磁碟管理的最小單位。在innodb儲存引擎中,預設每個頁的大小為16 kb。而從innodb 1.2.x版本開始,可以通過引數innodb_page_size將頁的大小設定為4 k、8 k、16 k。若設定完成,則所有表中頁的大小都為innodb_page_size,不可以對其再次進行修改。除非通過mysqldump匯入和匯出操作來產生新的庫。

innodb的資料是按資料頁為單位來讀寫的。也就是說,當需要讀一條記錄的時候,並不是將這個記錄本身從磁碟讀出來,而是以頁為單位,將其整體讀入記憶體。

而將資料從磁碟讀入記憶體涉及隨機io的訪問,是資料庫裡面成本最高的操作之一,所以為了減少磁碟io,innodb設計了change buffer這個機制。

2. change buffer

在mysql 5.5之前的版本中,由於只支援快取insert操作,所以最初叫做insert buffer,只是後來的版本中支援了更多的操作型別快取,才改叫change buffer,這也是為什麼**中有大量的ibuf字首開頭的函式或變數。

然而使用change buffer需要同時滿足兩個條件:

(1) 索引是輔助索引

插入聚簇索引一般是順序的,一般不需要磁碟的隨機讀取,所以不需要使用change buffer

(2) 索引不是唯一的

輔助索引不能是唯一的,因為在插入緩衝時,資料庫並不去查詢索引頁來判斷插入的記錄的唯一性。如果去查詢肯定又會有離散讀取的情況發生,從而導致change buffer失去了意義。

3. change buffer的底層實現

change buffer底層結構是一顆全域性的b+樹,負責對所有的表空間進行change buffer。

4. merge buffer

從上文可知change buffer是一棵b+樹。當需要實現插入記錄的輔助索引頁不在緩衝池中,輔助索引記錄首先會插入到這棵b+樹中。那麼insert buffer中的記錄何時合併(merge)到真正的輔助索引中呢?

merge操作可能發生在以下幾種情況下

第一種情況為當輔助索引頁被讀取到緩衝池中時,例如這在執行正常的select查詢操作,這時需要檢查insert buffer bitmap頁,然後確認該輔助索引頁是否有記錄存放於insert bufferb+樹中。若有,則將insert bufferb+樹中該頁的記錄插入到該輔助索引頁中。對該頁多次的記錄操作通過幾次操作合併到了原有的輔助索引頁中,因此效能會有大幅提高。

第二種情況insert buffer bitmap頁用來追蹤每個輔助索引頁的可用空間,並至少有1/32頁的空間。若插入輔助索引記錄時檢測到插入記錄後可用空間會小於1/32頁,則會強制進行乙個合併操作,即強制讀取輔助索引頁,將insert buffer b+樹中該頁的記錄及待插入的記錄插入到輔助索引頁中。這就是上述所說的第二種情況。

第三種情況就是在master thread執行緒中每秒或每10秒會進行一次merge change buffer的操作,不同之處在於根據執行緒的工作狀態每次進行merge操作的頁的數量不同。

5. change buffer的使用場景

change buffer主要作用是將記錄的變更快取下來,merge的時候是真正進行資料更新的時刻,所以在乙個資料頁做merge之前,change buffer記錄的變更越多(也就是這個頁面上要更新的次數越多),收益就越大。

因此,對於寫多讀少的業務來說,頁面在寫完以後馬上被訪問到的概率比較小,此時change buffer的使用效果最好。這種業務模型常見的就是賬單類、日誌類的系統。

Scrapy item資料儲存到mysql

以下操作是在window環境下進行的 pip install mysqlclient2.新建pipelineitem 類class mysqlpipelineitem object def init self pass def process item self,item,spider pass d...

你真的理解大資料嗎?

大資料很火,已然是一種大勢所趨,是雷軍口中的下乙個吹起豬的風口,是劉強東哥倫比亞大學深造回來的第乙個發展物件。大資料牽動著全國精英的心。然而,你真的理解什麼是大資料嗎?就目前來看,對大資料進行解釋的聲音總體分為兩種,一種是大資料資料量級要大,一般可達到pb級別,有了足量的資料之後,根據資料搭建起乙個...

My SQL 插入資料

在這裡我們有乙個新建的表如下 我們使用insert可以插入單行 多行和插入查詢的結果。插入單行的兩種方法 1.使用建立表時預設的順序 這裡我們插入一行,需要嚴格按照建立表的順序來定義每個列的值。使用這種方式,對錶的每乙個列都必須給出值,對於auto increment的行,可以給出null值,該列將...