最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Mysql中頁分裂、合并的問題

 更新時間:2025年11月05日 14:28:24   作者:信仰_273993243  
文章主要討論了UUID作為主鍵在B+Tree中的排序方式、性能問題以及如何解決這些性能問題,同時,文章還介紹了在MySQL中刪除數(shù)據(jù)對頁的影響,并建議在主鍵選擇上優(yōu)先使用自增ID、雪花算法或有序UUID,以平衡唯一性和性能,感興趣的朋友跟隨小編一起看看吧

一、UUID作為主鍵

如果使用UUID作為主鍵,因為UUID是隨機(jī)字符串,那么它在有序的B+tree是如何排序的。

1、UUID在B+Tree中的存儲方式

UUID的字節(jié)序比較

// UUID內(nèi)部表示為16字節(jié)的二進(jìn)制數(shù)據(jù)
// 比較規(guī)則:從左到右按字節(jié)比較
// 示例UUID比較:
UUID1: 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
UUID2: 6d5c5a5e-5c5a-4e5a-8d5a-5a5e5c5a5e5c
// 比較過程:
// 第一個字節(jié):0x1a vs 0x6d → UUID1 < UUID2
// 因為 0x1a = 26, 0x6d = 109
注意: UUID 視為連續(xù)的 16 個字節(jié), UUID1 的字節(jié)序
列(十六進(jìn)制):1a 2b 3c 4d 5e 6f 7a 8b 9c 0d 1e 2f 3a 4b 5c 6d 
0x1a中前面0x表示16進(jìn)制。其實就基本上可以理解每個字符對比,從左到右依次對比。

如果是長度不同的,短的排在前面

2、UUID作為主鍵的性能問題

2.1 插入性能問題

比如B+tree中已經(jīng)存在一個字符是B的節(jié)點,因為UUID生成是隨機(jī)的可能生成了一個A,
可能生成了一個C,那么A就會插入到B的前面,前面的樹都排好的,A一插入就會導(dǎo)致樹結(jié)構(gòu)
需要重排。但是自增ID或者順序插入,不會影響B(tài)+tree的問題。

2.2 B+Tree頁分裂問題

1、順序?qū)懭?
-- 假設(shè)B+Tree的葉子節(jié)點容量為3條記錄
-- 當(dāng)前數(shù)據(jù)頁狀態(tài):
頁1: [1, 2, 3]    -- 已滿
頁2: [4, 5, 6]    -- 已滿  
頁3: [7, 8]       -- 有空間
-- 插入新記錄:id = 9
-- 過程:直接追加到頁3 → [7, 8, 9] ?
-- 無頁分裂,性能極佳

2、UUID的插入過程(隨機(jī)寫入)

-- 同樣的B+Tree,使用UUID主鍵
-- 當(dāng)前數(shù)據(jù)頁狀態(tài)(按UUID排序):
頁1: [uuid_a, uuid_c, uuid_f]    -- 已滿
頁2: [uuid_h, uuid_m, uuid_p]    -- 已滿
頁3: [uuid_r, uuid_z]            -- 有空間
-- 插入新記錄:uuid_k(隨機(jī)生成)
-- 需要找到插入位置:在uuid_h和uuid_m之間
-- 但頁2已滿!觸發(fā)頁分裂過程

二、使用UUID解決排序問題:

1、自定義有序UUID生成

// 前8字節(jié):當(dāng)前時間戳(毫秒)+ 后8字節(jié):隨機(jī)數(shù),確保同一毫秒內(nèi)的唯一性
long timestamp = System.currentTimeMillis();
bb.putLong(timestamp);

2、優(yōu)先使用自增ID 或 雪花算法(有序字符串)

3、MySQL 8.0的UUID_TO_BIN

小結(jié)

總結(jié):不用UUID, 就算是無需的字符串作為主鍵,或者字符串作為非主鍵索引,都會有同樣的問題,所以不是特殊場景,盡量不要使用字符串作索引或者保持字符串是有序的插入。

所以在主鍵選擇上(插入性能+防止頁分裂):自增ID > 雪花算法(有序且分布式唯一)> 有序UUID(平衡唯一性和性能) > UUID(隨機(jī))

三、Mysql刪除數(shù)據(jù)對頁的影響

1、刪除中間數(shù)據(jù)時的B+Tree變化(可能會導(dǎo)致頁合并)

-- 初始狀態(tài):B+Tree葉子節(jié)點
頁1: [1, 3, 5]    -- 已用空間 100%
頁2: [7, 9, 11]   -- 已用空間 100%
頁3: [13, 15]     -- 已用空間 66%
-- 刪除中間數(shù)據(jù):刪除記錄 7
頁2: [9, 11]      -- 已用空間 66%,有剩余空間
-- 刪除不會導(dǎo)致分裂,反而可能觸發(fā)合并?。ó?dāng)頁的使用率低于50%時,觸發(fā)頁合并)

2、InnoDB的實際對頁合并做了優(yōu)化機(jī)制

1、刪除操作的惰性處理
-- InnoDB不會立即進(jìn)行頁合并,而是:
-- 1. 標(biāo)記記錄為已刪除(邏輯刪除)
-- 2. 在后臺由purge線程清理
-- 3. 在合適時機(jī)進(jìn)行頁合并
-- 查看刪除狀態(tài)
SHOW ENGINE INNODB STATUS;
-- 在輸出中查找 "PHYSICAL DELETES" 和 "LOGICAL DELETES"

所以我們的業(yè)務(wù)表,最好是定義一個邏輯刪除字段:is_Deleted

到此這篇關(guān)于Mysql中頁分裂、合并的問題的文章就介紹到這了,更多相關(guān)mysql頁分裂合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

日照市| 长沙市| 古田县| 瑞金市| 五大连池市| 合川市| 罗山县| 松阳县| 星座| 镇赉县| 屯留县| 新宁县| 瑞金市| 丰顺县| 富锦市| 平和县| 古蔺县| 思南县| 思茅市| 施秉县| 邻水| 什邡市| 玉山县| 泉州市| 漾濞| 松原市| 德格县| 方城县| 玉林市| 平舆县| 天门市| 新郑市| 广水市| 山东省| 织金县| 宝应县| 开江县| 沧州市| 丹巴县| 米泉市| 旬阳县|