一顆B+樹的層高最好控制在3層之內,到第4層性能會急劇下降。
計算機存儲數據時,一個扇區512KB,一個文件是4KB,innodb存儲一頁是16KB,innodb的所有文件大小一定是16KB的整數倍,一定是16384 byte的整倍數。
一個葉子節點有多少字節可以存放指向下一節點的指針,取決於主鍵的類型,比如bigint是8字節,而指針又占用6字節,所以指針可以指向1170個非葉子節點:
16384 / (8+6)= 1170 個非葉子節點
同理,指向葉子節點的個數也可以是1170個,那么3層高的一顆B+樹可以存儲:
第一層指向1170個非葉子節點,第二層再指向1170個葉子節點,1170 * 1170 = 1368900 個葉子節點
那么假設一條記錄1KB大小,那么一頁16KB就可以存儲16行,那么 16行 * 1368900 個葉子節點 = 21902400 行。
【結論】
在每行數據是1KB的情況下,3層高的B+數可以存放2190萬多條數據。
【為什么mysql使用B+樹?而不是B樹?】
因為B樹的非葉子節點也存儲數據,而B+樹只有在葉子節點才存儲數據,所以B樹因為存放了數據,所以能放指針的地方就變少了,那要保存同樣多的數據,就一定要增加樹的高度,如果運氣好,那么可能在中間的葉子節點就能找到,如果運氣不好,那么需要找很多節點才能找到,這個性能是不穩定的。
【HashMap適合做數據庫索引嗎?】
1、數據量很大的時候hash沖突也很大
2、不支持排序
3、不支持range范圍取值
【密集索引和稀疏索引】
如果這個索引樹上不僅有指定的索引列的值,還有其他列的值,那么就是密集索引,比如主鍵索引。
只保存了構成了索引的列,比如組合索引a,b,c,那么該索引樹只包含了a,b,c三個列的值,沒有保存其他更多列的值,就是稀疏索引,那么所有二級索引都是稀疏索引。
【mysql合並sql語句】
insert into t1 values(...),(...),(...); 合並了sql語句
end.