主頁 > 知識(shí)庫 > mysql聚簇索引的頁分裂原理實(shí)例分析

mysql聚簇索引的頁分裂原理實(shí)例分析

熱門標(biāo)簽:400電話可以免費(fèi)申請(qǐng)嗎 騰訊地圖標(biāo)注提升 福建外呼系統(tǒng)定制化 怎么在地圖標(biāo)注位置生成圖片 銅陵防封電銷卡 電銷卡外呼系統(tǒng)供應(yīng)商 真人語音電話機(jī)器人 美國反騷擾電話機(jī)器人 悟空科技電話機(jī)器人

本文實(shí)例講述了mysql聚簇索引的頁分裂。分享給大家供大家參考,具體如下:

在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存儲(chǔ)引擎是采用聚簇索引的。

聚簇結(jié)構(gòu)的特點(diǎn):

  • 根據(jù)主鍵查詢條目時(shí),不用回行(數(shù)據(jù)就在主鍵節(jié)點(diǎn)下)
  • 如果碰到不規(guī)則數(shù)據(jù)插入時(shí),造成頻繁的頁分裂

為什么會(huì)產(chǎn)生頁分裂?

這是因?yàn)榫鄞厮饕捎玫氖瞧胶舛鏄渌惴ǎ颐總€(gè)節(jié)點(diǎn)都保存了該主鍵所對(duì)應(yīng)行的數(shù)據(jù),假設(shè)插入數(shù)據(jù)的主鍵是自增長的,那么根據(jù)二叉樹算法會(huì)很快的把該數(shù)據(jù)添加到某個(gè)節(jié)點(diǎn)下,而其他的節(jié)點(diǎn)不用動(dòng);但是如果插入的是不規(guī)則的數(shù)據(jù),那么每次插入都會(huì)改變二叉樹之前的數(shù)據(jù)狀態(tài)。從而導(dǎo)致了頁分裂。

測(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條無規(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/>';

測(cè)試結(jié)果圖

1W條規(guī)則的數(shù)據(jù):998秒 = 16分鐘
1W條不規(guī)則的數(shù)據(jù):1939秒 = 32分鐘

結(jié)論:

聚簇索引的主鍵值,應(yīng)盡量是連續(xù)增長的值,而不是要是隨機(jī)值, (不要用隨機(jī)字符串或UUID),否則會(huì)造成大量的頁分裂與頁移動(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ǔ)過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》

希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。

您可能感興趣的文章:
  • MySQL學(xué)習(xí)教程之聚簇索引
  • 詳解MySQL 聚簇索引與非聚簇索引
  • 一看就懂的MySQL的聚簇索引及聚簇索引是如何長高的

標(biāo)簽:湖北 烏海 湖南 聊城 武威 云浮 臨汾 白銀

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql聚簇索引的頁分裂原理實(shí)例分析》,本文關(guān)鍵詞  mysql,聚簇,索引,的,頁,分裂,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql聚簇索引的頁分裂原理實(shí)例分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql聚簇索引的頁分裂原理實(shí)例分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章