mysql聚簇索引的頁(yè)分裂原理實(shí)例分析
本文實(shí)例講述了mysql聚簇索引的頁(yè)分裂。分享給大家供大家參考,具體如下:
在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存儲(chǔ)引擎是采用聚簇索引的。
聚簇結(jié)構(gòu)的特點(diǎn):
- 根據(jù)主鍵查詢條目時(shí),不用回行(數(shù)據(jù)就在主鍵節(jié)點(diǎn)下)
- 如果碰到不規(guī)則數(shù)據(jù)插入時(shí),造成頻繁的頁(yè)分裂
為什么會(huì)產(chǎn)生頁(yè)分裂?
這是因?yàn)榫鄞厮饕捎玫氖瞧胶舛鏄?shù)算法,而且每個(gè)節(jié)點(diǎn)都保存了該主鍵所對(duì)應(yīng)行的數(shù)據(jù),假設(shè)插入數(shù)據(jù)的主鍵是自增長(zhǎng)的,那么根據(jù)二叉樹(shù)算法會(huì)很快的把該數(shù)據(jù)添加到某個(gè)節(jié)點(diǎn)下,而其他的節(jié)點(diǎn)不用動(dòng);但是如果插入的是不規(guī)則的數(shù)據(jù),那么每次插入都會(huì)改變二叉樹(shù)之前的數(shù)據(jù)狀態(tài)。從而導(dǎo)致了頁(yè)分裂。
測(cè)試:
創(chuàng)建2張表
create table t8( id int primary key, c1 varchar(500), c2 varchar(500), c3 varchar(500), c4 varchar(500), c5 varchar(500), c6 varchar(500) ) engine innodb charset utf8; create table t9( id int primary key, c1 varchar(500), c2 varchar(500), c3 varchar(500), c4 varchar(500), c5 varchar(500), c6 varchar(500) ) engine innodb charset utf8;
寫一個(gè)php腳本,用于插入1W條無(wú)規(guī)則的主鍵數(shù)據(jù)和1W條規(guī)則的主鍵數(shù)據(jù),來(lái)看看區(qū)別。
<?php set_time_limit(0); $conn = mysql_connect('localhost','root','1234'); mysql_query('use test;'); //自增長(zhǎng)主鍵 $str = str_repeat('a', 500); $startTime = microtime(true); for($i=1;$i<=10000;$i++){ mysql_query("insert into t8 values($i,'$str','$str','$str','$str','$str','$str')"); } $endTime = microtime(true); echo $endTime-$startTime.'<br/>'; //無(wú)序的主鍵 $arr = range(1, 10000); shuffle($arr); $startTime = microtime(true); foreach($arr as $i){ mysql_query("insert into t9 values($i,'$str','$str','$str','$str','$str','$str')"); } $endTime = microtime(true); echo $endTime-$startTime.'<br/>';
測(cè)試結(jié)果圖
1W條規(guī)則的數(shù)據(jù):998秒 = 16分鐘
1W條不規(guī)則的數(shù)據(jù):1939秒 = 32分鐘
結(jié)論:
聚簇索引的主鍵值,應(yīng)盡量是連續(xù)增長(zhǎng)的值,而不是要是隨機(jī)值, (不要用隨機(jī)字符串或UUID),否則會(huì)造成大量的頁(yè)分裂與頁(yè)移動(dòng)。在使用InnoDB的時(shí)候最好定義成:
id int unsigned primary key auto_increment
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》及《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。
相關(guān)文章
MySql連接數(shù)據(jù)庫(kù)常用參數(shù)及代碼解讀
這篇文章主要介紹了MySql連接數(shù)據(jù)庫(kù)常用參數(shù)及代碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02數(shù)據(jù)庫(kù)中的SELECT語(yǔ)句邏輯執(zhí)行順序分析
這篇文章主要介紹了數(shù)據(jù)庫(kù)中的SELECT語(yǔ)句邏輯執(zhí)行順序分析,并列出了一些例子,需要的朋友可以參考下2014-07-07重置MySQL中表中自增列的初始值的實(shí)現(xiàn)方法
這篇文章主要介紹了重置MySQL中表中自增列的初始值的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-03-03window10系統(tǒng)下mysql5.7安裝審計(jì)插件(親測(cè)有用)
mysql有沒(méi)oracle這樣的審計(jì)功能,突然想在mysql做審計(jì)怎么辦,下面帶大家從零開(kāi)始給mysql安裝審計(jì)插件,親測(cè)絕對(duì)可用哦,需要的朋友可以參考下2022-09-09