一、MySQL記錄的存儲結構:
1、Page的結構,如下圖:

1.1 頁頭
記錄頁面的控制信息,共占56字節(jié),包括頁的左右兄弟頁面指針、頁面空間使用情況等。
1.2 虛記錄
最大虛記錄:比頁內最大主鍵還大
最小虛記錄:比頁內最小主鍵還小
1.3 記錄堆
行記錄存儲區(qū),分為有效記錄和已刪除記錄
1.4 自由空間鏈表
已刪除記錄組成的鏈表
1.5 未分配空間
頁面未使用的存儲空間;
2、Page頁內記錄的維護
2.1 順序保證
邏輯連續(xù),如圖所示:

2.2 插入策略
為了提高內存的利用率,減少內存碎片化空洞,首先從自由空間鏈表中分配(已刪除的記錄鏈表),如果空間不夠再從未分配空間分配;
2.3 頁內查詢
二分查找,首先從物理連續(xù)的solt(0~n)中查找所在的solt位,然后再從page邏輯鏈表中找到所對應的記錄;如圖所示;

3、Page頁內數(shù)據(jù)特性
3.1 PageSize的固定大小為16KB
3.2 每頁至少兩天記錄,單行最大為8KB
3.3 最多存儲10個大字段
數(shù)據(jù)段最大768 ->(768+20)*10<8K
超出部分存儲在溢出頁
3.4 VARCHAR
1或2個字節(jié)描述字符長度;
實際內容存儲在長度字節(jié)之后;
VARCHAR(255) [一個字節(jié)]+內容
VARCHAR(256) [兩個字節(jié)]+內容
二、 InnoDB索引原理和優(yōu)化
1、索引的原理分析
1.1 聚簇索引
數(shù)據(jù)存儲在主鍵索引中,數(shù)據(jù)按主鍵順序存儲,如圖所示:

1.2 二級索引
除主鍵索引以外的索引,葉子中存儲主鍵值
一次查詢需要走兩遍查詢
主鍵大小會影響所有索引的大小,如圖所示:

1.3 聯(lián)合索引
Key由多個字段組成,最左匹配原則
一個索引只創(chuàng)建一棵樹按第一列排序
第一列相同按第二列排序
注意 :如果不是按照最左開始查找,無法使用索引,不能跳過中間列,某列使用范圍查詢后面的列不能使用索引。
2、索引的優(yōu)化分析
2.1 存儲空間
索引文件大小是由字段大小、頁內節(jié)點數(shù)目、樹的層數(shù)
2.2 主鍵的選擇
自增主鍵,順序寫入,效率高
隨機主鍵,結點分裂、數(shù)據(jù)移動
自增主鍵寫入磁盤利用率高,每次查詢走兩級索引
隨機主鍵寫入磁盤利用率低,每次查詢走兩級索引
業(yè)務主鍵:寫入查詢磁盤利用率都高,可以使用一級索引
聯(lián)合主鍵:影響索引大小,不易維護,不建議使用
2.3 聯(lián)合主鍵
按索引區(qū)分度排序,并且覆蓋索引;
2.4 字符串索引
字符是按照字節(jié)對比的,設置的時候注意控制長度;
不支持開頭的%模糊查詢,只能全表掃描;
-
存儲
+關注
關注
13文章
4793瀏覽量
90077 -
MySQL
+關注
關注
1文章
906瀏覽量
29555
發(fā)布評論請先 登錄
深度剖析MySQL/InnoDB的并發(fā)控制和加鎖技術
MySQL存儲引擎簡析
關于mysql存儲引擎你知道多少
最有用的mysql問答
MySQL存儲引擎完成更新語句執(zhí)行的方法
MySQL中的redo log是什么
innodb究竟是如何存數(shù)據(jù)的
MySQL5.6 InnoDB支持全文檢索
剖析MySQL InnoDB存儲原理(下)
剖析MySQL InnoDB存儲原理(上)
評論