全面了解Mysql 五 表

2021-09-27 20:50:28 字數 4001 閱讀 1225

表是順序存放的

mysql中所有的表都有主鍵,即使自己沒有顯示定義也會根據非空唯一索引,或者自動建立6位元組大小的指標作為主鍵,當有多個非空唯一索引時按照索引定義順序選擇,這個表儲存方式叫索引組織表。

如果單個列為主鍵時可以通過查詢語句加_rowid來檢視哪個列作為了主鍵,因為他會和作為主鍵的值一樣。

innodb邏輯儲存結構

innodb邏輯儲存由表空間組成,引數innodb_file_per_table可以用來開啟每張表使用乙個表空間,預設情況下共用乙個表空間ibdata1,如果開啟了每張表使用乙個表空間,這個表空間中只放資料、索引、插入緩衝頁,其它資料還是放共享空間內。

1)表空間一旦增加後就不會減小,但是會在表空間中標記出可用空間,下次申請空間時先使用可用空間,最後才增加檔案大小。想要了解表空間資訊可用參考表空間資訊讀取工具

2)前面說過mysql的表儲存是索引組織表,也就是資料即所有,即資料段就是b+樹的葉子節點,索引段為b+樹的非葉子節點。

3)區是組成段的最小單位,每個區大小都是1m,但是每個段的開始時,先用32個頁大小的碎片頁來存放資料,用來應對小表之類的節約磁碟開銷。

4)頁是組成區的最小單位,預設大小16k可以 通過innodb_page_size來設定頁的大小為4k、8k、16k,可用算出來每個區中頁的數量1m/16k,一旦設定該引數,所有的表的頁都是這個大小,只能通過匯入匯出產生新的庫來改變,innodb中常見的頁型別為資料頁(b-tree node)、undo頁(undo log page)、系統頁(system page)、事務資料頁(transaction system page)、插入緩衝點陣圖頁(insert buffer bitmap)、插入緩衝空閒列表頁(insert buffer free list)、未壓縮的二進位製大物件頁(uncompressed blob page)、壓縮的二進位製大物件頁(compressed blob page)。

行記錄格式

dynamic格式5.7中innode使用的格式,可以使用show table status like 『client%』 \g命令檢視格式

其中變成字段長度按照列的順序逆序放置的最多兩個位元組,當列的長度小於255位元組時使用乙個位元組表示,當大於255個位元組時使用兩個位元組,例如03 01 02這個代表第乙個可變列的長度為2,第二個可變列長度為1,第三個可變列長度為3,null標誌位占用乙個位元組,使用1表示該行有null值,例如05,轉為二進位制為00000101,說明第一列和第三列為空,那麼列資料中就直接沒有該資料

記錄頭資訊見下表表示,共40位

當資料為blob時,資料頁只存放20個位元組的指標,真實的資料會放到二進位製大物件頁。

當型別為char時,它會受到字元編碼的影響,當使用單位元組的編碼格式(如latin1)時,資料不足的地方會使用0x20來填充,而當使用多位元組的編碼格式時(如utf-8)它被視為變長字元型別。

資料頁結構

資料頁由7個部分組成,1)file header 一些頭資訊38位元組、2)page header 頁的狀態資訊56位元組、3)行記錄、4)空閒、5)頁目錄存放相對位置、6)file trailer 頁的完整性檢測8位元組

使用表空間資訊讀取工具檢視空間資訊,如圖00000003頁是b-tree node代表資料頁,那麼所在位置為3*頁大小16k=0xc000

可以按照規則進行讀取該檔案,這就不再做介紹。

約束不常用到的技術

1).當向非空列插入空時,如果報警告而不是錯可以調整sql_mode引數設定

1】only_full_group_by select的列必須在分組**現,

2】strict_trans_tables如果乙個值不能插入到乙個事務表中,則中斷當前的操作,對非事務表不做任何限制

3】no_zero_in_date不接受月或日部分為0的日期

4】no_zero_date不要將 '0000-00-00』做為合法日期

5】error_for_division_by_zero在insert或update過程中,如果被零除(或mod(x,0)),則產生錯誤(否則為警告)

6】no_auto_create_user防止grant自動建立新使用者,除非還指定了密碼

7】no_engine_substitution如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤

8】ansi模式:寬鬆模式,更改語法和行為,使其更符合標準sql

9】traditional模式:嚴格模式,當向mysql資料庫插入資料時,進行資料的嚴格校驗,保證錯誤資料不能插入

2).當想限定某個字段只能是對應的值時,我們可用使用enum型別來約束,如果範圍過於複雜,需要程式約束時只能使用觸發器了

檢視當我們的取數**於多個物理表時,通常為了查詢速度,可用建立乙個檢視,取數來自檢視表。

當我們檢視**表的變化很小,或者是很規律時,為了加快查詢速度,可通過觸發器自己做乙個物化檢視,就是這個檢視表是真實的表了,當**表有修改時通過觸發器來進行相關修改。

分割槽分割槽加快訪問的原理是減少乙個分割槽的資料量,也就意味著降低b+樹的層數,資料查詢速度和b+樹的層數成線性關係,也就是如果資料量不高,或者訪問的限定條件不固定,使用分割槽只會使訪問速度更慢。

目前mysql支援1)range分割槽,當行資料屬於乙個給定的連續區間時可用採用。2)list分割槽,當行資料屬於乙個集合時可以使用。3)hash分割槽,根據使用者自定義的表示式返回值進行分割槽。4)key分割槽,根據資料庫提供的雜湊函式進行分割槽。

可用使用命令 show variables like 『%partition%』 \g

分割槽建立語句如下

create

table a

( a int

, b datetime

)engine

=innodb

partition

by range (

year

(b))

(partition p2019 values less than (

2020),

partition p2018 values less than (

2019))

;create

table b

( a int

, b int

)engine

=innodb

partition

by list (b)

(partition p0 valuesin(

null,1

,2,3

),partition p1 valuesin(

4,5,

6,7)

);create

table c

( a int

, b datetime

)engine

=innodb

partition

byhash

(year

(b))

partitions 2

;create

table c

( a int

, b int

)engine

=innodb

partition

bykey

(b) partitions 2

;

全面了解MySql中的事務

為什麼要有事務?事務廣泛的運用於訂單系統 銀行系統等多種場景。如果有以下乙個場景 a使用者和b使用者是銀行的儲戶。現在a要給b轉賬500元。那麼需要做以下幾件事 1.檢查a500元 2.a賬戶扣除500元 3.b賬戶增加500元 正常的流程走下來,a賬戶扣了500,b賬戶加了500,皆大歡喜。那如果...

全面了解 Powerset

人們期待已久的自然語言搜尋引擎 powerset 終於亮相,powerset 將改變人們從 wikipedia 搜尋和發現資料的方式。基於 parc 專利許可,以及專有的搜尋技術的 powerset 將是自然語言搜尋技術的一種突破,它可以就任何主題或領域,從 wikipedia 的文章中抓取句子的含...

CSS margin全面了解

一 margin可以為負值 在盒模型中,內容區的width height padding border都不能為負值,但是margin例外,它可以為負值。關於margin負值的使用技巧,了解不多,日後有機會再補充,此處先貼乙個經典應用,margin left負值結合浮動實現不改變dom結構的流體布局。...