0:數據庫邏輯結構包括表空間,段,區,數據塊
1、數據庫在邏輯上是由多個表間組成的,表空間中存儲的對象是段;
2、段,由區組成,比如數據段,索引段,和undo段;
3、區,是磁盤分配的最小單位,是物理上連續的塊,一個extent的大小是1M,由64個頁組成;
4、塊(頁),在MySQL中塊就是頁,是數據庫中最小的I/O單位,同時也是內存數據緩沖區的單位,及數據文件存儲空間單位,一個page的大小是16K(默認,一般也不會更改),innodb_page_size,其值應設置為操作系統塊大小的整數倍。
1、表空間(tablespace)
表空間是數據庫最大的邏輯結構,一個數據庫在邏輯上由多個表空間組成,一個表空間只隸屬於一個數據庫。
1、一個表空間可以有多數據文件,但是一個數據文件只能屬於一個表空間;
2、一個表空間就是一片磁盤區域,由一個或者多個磁盤文件組成,一個表空間可以容納許多表、索引等。
2、段(segment)
一個表就是一個段,段可以分成:數據段、索引段、回滾段
1、數據段用來存儲用戶的數據,每個表都有一個對應的回滾段,其名稱和數據表的名字相同;
2、索引段用來存儲系統、用戶的索引信息;
3、回滾段用來存儲用戶數據修改前的值,回退段與事務是一對多的關系,一個事務只能使用一個回退段,而一個回退段可存放一個或多個事務的回退數據。
3、區(extent)
區是磁盤空間分配的最小單位;
1、磁盤按區划分,每次至少分配一個區;
2、區存儲於段中,它由連續的數據塊組成。
4、塊(data block)、頁(page)
數據塊是數據庫中最小的數據組織單位與管理單位,是數據文件磁盤存儲空間單位,也是數據庫I/O 的最小單位。
5、數據行的格式
行的幾個關注要素:
1、變長列字節列表
1>記錄了各個變長列的長度情況,方便找到變長邊界;
2>按照列順序逆序放置
2、null列表
1>記錄null的列的標志信息,因為null的列在行記錄里不記錄列值,方便找的時候知道哪列是空的
2>空列不占空間,可變長+null位,定位后面的列數據
3、行頭標志
4、列數據:實際我們存放的數據
5、刪除標記(deleted_flag):刪除時對該行進行標記“deleted”,待purge
對於未提交事務的刪除,其他可以繼續select,因為沒有真正的刪除,也就不用勞煩undo了。
6、xid(6字節)、rollpointer(7字節)
如果沒有定義主鍵的話,每行還會增加個rowid列(6字節),作為隱藏主鍵;
6、行列接
1、varchar可以很長,varchar(20):可以存放20個字符
gbk:一個字符占2個字節,因此實際上占用40個字節
utf8:一個字符大約占3個字節,因此實際上占用60個字節
2、blob列,主要用來存放圖片、文件
建議:
1、對於大列,單獨獨立出去,采用垂直拆分表的方式來實現
2、不要出現一個表中存在多列、長列的情況,否則表的性能會很低下