一:總結
- 預設的行格式定義 innodb_default_row_format
- 檢視當前資料表行格式 show table status 'table';
- 建立表指定行格式 create table table(.......)row_format=dynamic;
- 修改錶行格式 alter table table row_format=dynamic;
二:為什麼mysql的最大行長度最大是 65535 ?
- innodb是以聚簇索引組織資料的,也就是說,資料都存在葉子節點上。
- 那麼最大的行長度是 65535(64kb),那不就意味著,葉子節點上,會存在 64kb 的資料。
- 但是,innodb 是以 頁(page) 為最小單位儲存資料的,預設為16kb。
- 如果乙個行資料,超過了一頁的一半,那麼乙個頁只能容納一條記錄,這樣b+tree在不理想的情況下就變成了雙向鍊錶。
- 所以 mysql 會存在限制,不會讓行資料超過 頁 的一半。(也就是說乙個頁最少有兩條資料)
- 這裡,就和我之前理解的不一樣了(每行最大位元組數是65535位元組,每頁預設是16k,最多放兩行,不應該是8192位元組嗎?反過來推算的話是不是說頁的大小是128k嗎?)
三:理解 65535
- 「65535」不是單個varchar(n)中n的最大限制,而是整個表非大字段型別的字段的bytes總合
- 根據mysql官方文件,在進行資料儲存的時候,會將資料分為兩部分
- 可變長度的型別字段 (varbinary, varchar, blob and text), 這部分資料會根據 行格式,進行頁溢位儲存。
- 定長字段的占用空間大小,這些資料會存放在 葉子節點上,資料大小不超過頁大小的一半(innodb_page_size)
- 也就是說,mysql 使用了 頁溢位來儲存 可變長型別 的資料,那麼,頁溢位是如何儲存的呢?
- 這就是今天要說的 行格式。
四:行格式
- mysql 共有四種行格式的儲存方式 redundant(冗餘行格式) / compact / dynamic(動態行格式) / compressed(壓縮行格式)
- redundant(冗餘行格式) / compact
- 原理
- 如果blob列值長度 <= 768 bytes,不會發生行溢位(page overflow),內容都在資料頁(b-tree node)
- 如果列值長度 > 768位元組,那麼前768位元組依然在資料頁,而剩餘的則放在溢位頁(off-page)
- 如下圖:
- 問題
- 這對於相對較短的blob列值很好用,但是可能導致b樹節點填充資料而不是鍵值,從而降低了效率。
- 具有許多blob列的表可能會導致b樹節點變得太滿,並且包含的行太少,這使得整個索引的效率低於行較短或列值儲存在頁面外的情況。
- 使用場景
- compact行格式將行儲存空間減少了約20%redundant,但代價是增加了某些操作的cpu使用率。
- 如果在 cpu 允許的情況下,使用 compact。
- dynamic(動態行格式) / compressed(壓縮行格式)
- 原理
- 如下圖:
- 使用場景
- compressed行格式提供相同的儲存特性和功能的 dynamic行格式,但增加了對錶和索引資料壓縮的支援。
- 如果在 cpu 允許的情況下,使用 compressed
五:總結
- 資料行並不是全部放在 聚簇索引中的。而是根據行格式的不同/可變長的不同,會額外的儲存在其他頁中。(頁溢位)
- 65535 是對變長字段的總和限制。
- 根據不同的場景選擇不同的行格式。
- 參考
mysql行格式 MySQL 行格式
以 mysql 預設的儲存引擎 innodb 為例 innodb 包含以下四種行格式 compact redundant dynamic compressed 指定行格式 create table 表名 列的資訊 row format 行格式名稱 alter table 表名 row format ...
mysql 動態行轉列 MySQL行轉列
比如乙個單子,多個收據單用逗號隔開,怎麼把這乙個單子所有收據單獨展示出來,行轉成列呢?方法一 這裡需要用到迴圈,首先建立乙個1 10的序列 select rownum rownum 1 as seq from select rownum 0 r,bills limit 0,10 其次依次運用 sub...
mysql行 MySQL 行的詳細操作
閱讀目錄 介紹mysql資料操作 dml 在mysql管理軟體中,可以通過sql語句中的dml語言來實現資料的操作,包括 使用insert實現資料的插入 update實現資料的更新 使用delete實現資料的刪除 使用select查詢資料以及。本節內容包括 插入資料 更新資料 刪除資料 查詢資料 插...