本文實例講述了mysql聚簇索引的頁分裂。分享給大家供大家參考,具體如下:
在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存儲引擎是采用聚簇索引的。
聚簇結(jié)構(gòu)的特點:
為什么會產(chǎn)生頁分裂?
這是因為聚簇索引采用的是平衡二叉樹算法,而且每個節(jié)點都保存了該主鍵所對應(yīng)行的數(shù)據(jù),假設(shè)插入數(shù)據(jù)的主鍵是自增長的,那么根據(jù)二叉樹算法會很快的把該數(shù)據(jù)添加到某個節(jié)點下,而其他的節(jié)點不用動;但是如果插入的是不規(guī)則的數(shù)據(jù),那么每次插入都會改變二叉樹之前的數(shù)據(jù)狀態(tài)。從而導(dǎo)致了頁分裂。
測試:
創(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;
寫一個php腳本,用于插入1W條無規(guī)則的主鍵數(shù)據(jù)和1W條規(guī)則的主鍵數(shù)據(jù),來看看區(qū)別。
?php set_time_limit(0); $conn = mysql_connect('localhost','root','1234'); mysql_query('use test;'); //自增長主鍵 $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/>'; //無序的主鍵 $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/>';
測試結(jié)果圖
1W條規(guī)則的數(shù)據(jù):998秒 = 16分鐘
1W條不規(guī)則的數(shù)據(jù):1939秒 = 32分鐘
結(jié)論:
聚簇索引的主鍵值,應(yīng)盡量是連續(xù)增長的值,而不是要是隨機(jī)值, (不要用隨機(jī)字符串或UUID),否則會造成大量的頁分裂與頁移動。在使用InnoDB的時候最好定義成:
id int unsigned primary key auto_increment
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
標(biāo)簽:湖北 烏海 湖南 聊城 武威 云浮 臨汾 白銀
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql聚簇索引的頁分裂原理實例分析》,本文關(guān)鍵詞 mysql,聚簇,索引,的,頁,分裂,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。