innodb是將資料存在磁碟上的儲存引擎。
查詢需要將磁碟資料讀到記憶體來處理,修改刪除需要將記憶體資料寫入磁碟。磁碟io是非常慢的,所以,以頁(16kb)作為記憶體和磁碟互動的基本單位。
行格式 (row_format)
insert一條資料,該資料就包含在頁中,每條資料儲存有一定的格式要求,通過row_format來指定。如:create table 表名 (列的資訊) row_format=行格式名稱;
row_format有四種格式:compact
、redundant
、dynamic
和compressed
規定:每行最多存65535位元組(64kb,blob,text除外)。超過大小,創表失敗。
utf8 乙個字元包括1~3個位元組。
行溢位
一頁最大16kb而一條記錄最大可64kb,存在一頁存不下一行記錄的情況即行溢位。
乙個頁要求最少存2條記錄,加上其他額外資訊,大概一條記錄超過7kb左右即可能存在行溢位。
對於出現行溢位的情況,compact行格式是在真實資料中存一部分該行的資料(768個位元組)+其他頁的位址,把剩下資料放到其他頁中。
頁的資訊存在磁碟上,記憶體中沒有的化,又會涉及磁碟io。設計表結構的時候盡量不要使用大字段,包括text,blob都會存在行溢位。
redundant行格式類似,只是額外資訊不同記錄的不同。
而dynamic和compressed在處理行溢位時不存真實資料,全放到其他頁中,只存其他頁的位址。
compressed行格式會採用壓縮演算法對頁面進行壓縮,以節省空間。
以下未特殊說明都是以compact為例:
每條記錄間的關係:
記錄在頁中是按主鍵遞增的順序排列,在頭資訊中有指向下條記錄的位址(單鏈表)。
刪除記錄並沒有真實刪除:
記錄頭資訊中有標誌位,記錄該條記錄是否刪除。因為真的從磁碟中刪除,如刪除多條記錄的話又不是按主鍵順序刪的,可能會造成其他記錄在磁碟上重新排列。而且在mvcc多版本併發控制的時候也可以記錄之前的版本資訊。
所以用標誌位標記,單鏈表指標將其跳過。刪除的記錄形成可重用空間,新增的時候覆蓋原先的資料。
頁結構:
頁內存放多條使用者記錄,頁內的目錄索引,頁間的雙向鍊錶指標等。
記錄在頁內的存放形式:
使用者的每條資料放到user recouds裡,用單鏈表連線。同時對這些記錄進行分組,最多8條一組。把每組的最大主鍵的位址放到page directory中記錄,方便查詢。
因為記錄是按主鍵排序排列而且有頁內的目錄對主鍵進行索引,所以按主鍵查詢非常快。
過程:乙個主鍵到了某個頁之後,首先根據頁內的目錄索引按照二分法確定該主鍵所在的組。然後通過單向鍊錶遍歷該組所有的記錄。
頁與頁直接的關係:雙鏈表連線。
使用雙向鍊錶 因為在插入一條記錄時,當前頁已滿可以看臨近的頁有沒有空餘空間,這樣只需在兩個頁間移動記錄,不用**當前頁。
主鍵遞增
因為所有記錄預設按主鍵遞增排列,所以插入資料時盡量保證主鍵是遞增的,避免資料的移動。
用db本身的autoincrement欄位的話只能保證單個資料庫遞增,但分庫的分布式場景下,沒法保證整體遞增和全域性唯一性。用**控制擺脫某乙個資料庫,採用雪花演算法生成主鍵id(根據當前時間等引數運算生成隨機數保證遞增),當然redis快取也可生成遞增的數值。
mysql儲存過程格式 mysql儲存過程的寫法
可以使用 create procedure 語句建立儲存過程。資料庫儲存過程語法格式如下 create procedure 過程名 in out inout 引數名 資料型別 in out inout 引數名 資料型別 特性 過程體 delimiter create procedure myproc...
mysql資料儲存 mysql資料儲存
頁 從磁碟讀取或者寫入資料時,我們通常會指定乙個緩衝區大小,達到緩衝區域大小才會寫入一次資料,較少io操作次數。同樣的從磁碟讀取資料時候,就作業系統而言,讀取一條較小的資料時,並不是只會返回我們需要的資料,而是會將這個資料前後的部分資料一併讀取到記憶體中,以備之後使用。這個從磁碟讀取的最小量的資料被...
mysql 儲存過程 格式化 Mysql 儲存過程
可能存在中文的標點符號 儲存過程 含義 一組預先編譯好的sql語句的集合,理解成批處理語句 好處 1 提高 的重用性 2 簡化操作 3 減少了編譯次數並且減少了和資料庫連線的次數,提高了效率 一 建立語法 create procedure 儲存過程名稱 引數列表 begin 儲存過程體 一組合法的s...