讀mysql技術內幕InnoDB 第四章

2022-05-04 04:42:11 字數 3440 閱讀 6141

表:

mysql innodb的儲存邏輯結構和oracle大致相同,--表空間:段 segment,區:extent  頁:page(塊,block)

對於mysql的隱行主鍵我就不做介紹了,以前說過

innodb引擎,在rollback的時候不會去**表空間,而是將undo資訊判斷是否需要,不需要就標記為可用空間,下次undo使用

段:資料段,索引段,回滾段等,

innodb的引擎對段的管理師有引擎本身完成的,不是每個物件都有段,表空間是有分散的頁和段組成的。

區:64個連續的page組成,每個page16k,sql server 8k

對於大的資料innodb引擎,每次最多可以申請4個區,來保證資料的順序性

頁:innodb磁碟管理的最小的單位,資料頁b-tree node,undo頁,系統頁,事務資料頁,插入緩衝點陣圖頁,插入緩衝空閒列表頁

未壓縮的二進位製大物件頁,壓縮的二進位製大物件頁

行:innodb儲存引擎是面向行的,型別有:compact和redundant,show table status  like  'test'\g; row_famact 是行的記錄 結構型別

comapact 行記錄:

目標能高效的存放資料,

null值,除了占用null的標誌位置,不占用任何空間,(varchar,char)

redundant 行記錄格式

為了相容5.0以前的版本

varchar 的null值不佔空間,char的null值占用空間

char 會佔據可能存放的最大值位元組數

上邊這些的,我不是不關心,只不過是目前我還沒遇到過什麼問題,我重點要說的是下面的,我曾經遇到過的問題:

行溢位:

我曾經遇到這個問題是在我建立資料表的時候,有多個varchar(7000),我不知道為什麼當時我的資料庫會提示我把型別轉換成text,現在才發現自己太弱了

我只能說雖然varchar的儲存是65535,但是他指的是所有varchar列長度的總和,而不是單獨乙個的,

varchar 溢位的時候,儲存在blob中

編碼也會影響的,字元佔的位元組導致的這種情況的產生

gbk,每個字元最多2個位元組,utf8,每個字元最多3個位元組

轉化varchar-》text

在innodb 內部對於多位元組字符集型別的儲存,char很明確的被視為變長型別,

檢視,觸發器,我這裡不做太多的描敘,因為以前的文章寫過

外來鍵:分割槽:

mysql 支援的分割槽型別為水平分割槽

key分割槽:根據mysql提供的雜湊函式分割槽

如果表中存在主鍵或者唯一索引的時候,分割槽列必須是唯一索引的乙個組成部分

hash分割槽:按照使用者自定義的表示式的返回值來進行分割槽,返回值不能為負數

1

create table test12(

2 id tinyint not null

,3 count int not null,4

primary key(count,id),

5unique key(count)

6 )engine=innodb

7 partition by hash(count);

我第一次出現了這個錯誤:

這是因為在建立分割槽的時候,。資料庫要求我們建立分割槽的字段必須在主鍵裡面

如下:

range分割槽:行資料基於乙個給定的連續區間的列值放入分割槽1create table tests(

2date datetime

3 )engine=innodb

4partition by range (year(date))(

5 partition p2008 values less than(2009

),6 partition p2009 values less than(2010),7

8 );

在使用分割槽的時候,我們要記得優化自己的sql語句

list分割槽:list分割槽面向的是雜湊的值

1

create table tests(

2count tinyint

3 )engine=innodb

4partition by list(count)(

5 partition p1 values in (2,5,8

),6 partition p2 values in (3,6,9),7

8 );

key分割槽

1

create table tests(

2count tinyint

3 )engine=innodb

4 partition by key(count);

這四種分割槽的條件必須是整型,不是整型的也要轉換成整型

hash和key的區分對於null的處理,總是返回0

list分割槽必須指明那個分割槽儲存null

range分割槽下null值會被放入最左邊的分割槽

py_innodb_page_info.py 工具介紹

使用之前,機器上必須安裝python,大家有時間看一下

保證你的機器由執行py_innodb_page_info.py的許可權

進入檔案目錄:./py_innodb_page_info.py -v /檔名稱

讀MySQL技術內幕筆記

1.mysql 單程序多執行緒 2.資料庫和例項的定義 3.mysql組成部門 連線池元件 管理服務和工具元件 sql介面元件 查詢分析器元件 優化器元件 緩衝 cache 元件 外掛程式式儲存引擎 物理檔案 4.innodb後台執行緒 master thread io thread purge 清...

MySQL技術內幕

innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...

MySQL技術內幕(一)

1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...