innodb邏輯儲存結構
所有資料被邏輯地存放在表空間中,表空間又由段、區、頁(有些文件稱之為塊)、行組成。
段:常見的段有資料段、回滾段、索引段(與約束這種邏輯概念不同,索引是一種資料結構,不止有邏輯上的概念,在資料庫中還代表著物理儲存的方式。索引段即b+樹的非索引節點)等。
innodb由自身完成對段的管理,開發者不能也沒必要介入。
區:連續頁組成的空間,大小固定1mb。
頁:每頁至少要存2行資料,行記錄太大,就讓行溢位。
innodb葉子節點儲存的資料,並不是具體某行,而是該行資料所在的頁,資料庫會把整頁資料讀入記憶體,在記憶體中查詢到想要的資料。所以頁的大小並非越大越好,太小,管理鍊錶就越長,還有增加io風險,太大會有占用過多記憶體風險,預設16kb,可設為4、8kb等。
行:資料最小儲存單元。
分割槽:
分割槽是將乙個表或索引分解為多個更小、更可管理的部分。啟用分割槽後,innodb表由乙個ibd檔案分為每個分割槽乙個,b+樹也是每個分割槽乙個了。
mysql支援顯式的分割槽選擇查詢,當你知道增刪查改的資料在其中某分割槽並指出時,mysql會僅查詢指定分割槽。
但是,分割槽本身大概率會增大一些處理邏輯的複雜度,不僅如此,例如innodb,要處理的業務在多個分割槽時,你就讀了多個b+樹,很多時候,mysql的效能瓶頸在磁碟io過多,此時只分割槽不分表無太大幫助,反而有增大io風險。
mysql支援水平分割槽,不支援垂直分割槽(官方8.0文件中說,目前並沒有支援垂直分割槽的計畫)。同一分割槽表的不同分割槽需要用同一引擎,在mysql 8.0中,支援分割槽的儲存引擎是innodb和 ndb,僅innodb 儲存引擎提供了本機分割槽處理程式。
表中存在唯一或主鍵索引時,分割槽列必須是每個唯一索引的乙個組成部分。部分mysql函式在分割槽後不被支援。
分割槽型別:
range(範圍):給定連續區間來區分
list(列表):給定離散值區分
hash(雜湊):根據使用者自定義表示式的返回值區分
key(金鑰):根據mysql的hash函式區分
columes(組合列):(range columes/list columes):基於多個列值來定義分割槽,這些列值可以非整型。
range columes與range區別:
range columes 不接受表示式,僅接受列名,接受乙個或多個列的列表,range columns分割槽列不限於整數列;字串, date、 datetime列也可以用作分割槽列。
list columes與list區別:
允許將多個列用作分割槽鍵,並且可以將整數型別以外的資料型別的列用作分割槽列;您可以使用字串型別 date,和 datetime列。
sub(子分割槽/復合分割槽):分割槽表中每個分割槽的進一步劃分
行格式:
innodb儲存引擎支援四種行格式:redundant(冗餘), compact(緊湊), dynamic(動態),compressed(壓縮),mysql5.7和mysql8預設dynamic(可由innodb_default_row_format設定;show table status like '表名'檢視;set global innodb_default_row_format=dynamic 設定)。
dynamic、compressed為新的頁格式,對於存放在blob中的資料採用了完全行溢位方式,在資料頁中只存放指標,實際資料都在溢位頁中,避免了用大量長列資料位元組填充b樹節點的問題,而之前的compact、redundant會存放部分字首位元組在資料頁。
(另:字首索引只能適用於普通索引中,不能使用在unique中,字首索引只支援英文和數字)
除了compressed(壓縮),其他都可設為預設值,系統表空間不支援 compressed行格式。(但可以手動把需要的庫表設為compressed)
(第三列:增強的可變長度列儲存)
mysql行格式 MySQL 行格式
以 mysql 預設的儲存引擎 innodb 為例 innodb 包含以下四種行格式 compact redundant dynamic compressed 指定行格式 create table 表名 列的資訊 row format 行格式名稱 alter table 表名 row format ...
mysql 設定行格式 mysql行格式
最近用phpmyadmin,突然發現有個引數row format,以下是手冊中的解答部分,看了之後水平又提公升了,做個記錄。另外看了這部分之後發現原來mysql儲存變長資料的方法和檔案系統原來一樣啊,都是資料和索引分離,然後一堆碎片和鏈結,哈哈。紅色標出的部分比較重要,很少有人會去關注,提醒大家看下...
MYSQL行格式分析介紹
新建資料庫表的時候有乙個行格式的選項,compact compressed fixed dynamic 這些選項分別在什麼時候使用呢?compact行格式 innodb預設行格式 結構如下 變長字段長度列表,null標誌位,記錄頭資訊,列1資料,列2資料。這個格式當初的設計是為了能高效存放資料,同時...