Mysql索引机制B+Tree
1、問題引入
有一個用戶表,為了查詢的效率,需要基于id去構(gòu)建索引。構(gòu)建索引我們需要考慮兩個方面的問題,1個是查詢的效率,1個是索引數(shù)據(jù)的存儲問題。該表的記錄需要支持百萬、千萬、甚至上億的數(shù)據(jù)量,如果將索引存儲到內(nèi)存中,盡管內(nèi)存的訪問速度非常快,查詢效率非常高,但是,占用內(nèi)存會非常大。
而且每次數(shù)據(jù)庫重啟后,索引數(shù)據(jù)就會丟失,需要在內(nèi)存里重新構(gòu)建索引。將索引存儲到硬盤中,減少了內(nèi)存的消耗,數(shù)據(jù)庫重啟,數(shù)據(jù)也不會丟失。
確定了硬盤存儲索引數(shù)據(jù),接下來就需要選擇合適的數(shù)據(jù)結(jié)構(gòu)存儲索引數(shù)據(jù)。首先我們會想到散列表,散列表查詢性能很好,時間復(fù)雜度為O(1),但是如果想要快速查詢id 在1~3之間的數(shù)據(jù),散列表就不能滿足了。散列表不滿足要求,我們自然會想到另一種數(shù)據(jù)結(jié)構(gòu)樹,樹的種類有很多種,到底哪種樹適合基于磁盤構(gòu)建索引呢?mysql采用b-tree的增強版b+tree 這種樹去構(gòu)建索引,這種樹可以大大減少磁盤io的操作,提高查詢效率。
2、磁盤讀寫原理
B-Tree是為磁盤等外存儲設(shè)備設(shè)計的一種平衡查找樹。因此在講B-Tree之前先了解下磁盤的相關(guān)知識。
2.1 硬盤組成:盤片(platter)、磁頭(head)、磁道(track)、扇區(qū)(sector)、柱面(cylinder)。
硬盤中一般會有多個盤片(platter)組成,每個盤片包含兩個面,每個盤面都對應(yīng)地有一個讀/寫磁頭。每個盤面都被劃分為數(shù)目相等的磁道,并從外緣的“0”開始編號,具有相同編號的磁道形成一個圓柱,稱之為磁盤的柱面。每個磁道被劃分成若干個扇區(qū)(sector),扇區(qū)是磁盤的最小組成單元,通常是512字節(jié)。
系統(tǒng)將文件存儲到磁盤上時,按柱面、磁頭、扇區(qū)的方式進(jìn)行,即最先是第1磁道的第一磁頭下(也就是第1盤面的第一磁道)的所有扇區(qū),然后,是同一柱面的下一磁頭,一個柱面存儲滿后就推進(jìn)到下一個柱面,直到把文件內(nèi)容全部寫入磁盤。讀取順序從上到下,然后從外到內(nèi)。
2.2 磁盤讀取響應(yīng)時間:
尋道時間:磁頭從開始移動到數(shù)據(jù)所在磁道所需要的時間,尋道時間越短,I/O操作越快,目前磁盤的平均尋道時間一般在3-15ms,一般都在10ms左右。
旋轉(zhuǎn)延遲:盤片旋轉(zhuǎn)將請求數(shù)據(jù)所在扇區(qū)移至讀寫磁頭下方所需要的時間,旋轉(zhuǎn)延遲取決于磁盤轉(zhuǎn)速。普通硬盤一般都是7200rpm,慢的5400rpm。
數(shù)據(jù)傳輸時間:完成傳輸所請求的數(shù)據(jù)所需要的時間。
從上面的指標(biāo)來看、其實最重要的、或者說、我們最關(guān)心的應(yīng)該只有兩個:尋道時間;旋轉(zhuǎn)延遲。為提高磁盤傳輸效率,軟件應(yīng)著重考慮減少尋道時間和延遲時間。
如果一個文件存儲在連續(xù)的扇區(qū)上,這樣就可以減少尋道時間和旋轉(zhuǎn)延遲,大大增加磁盤io讀取的效率,這就是為什么大家常說隨機讀寫速度將明顯低于順序讀寫。
2.3 磁盤塊
由于扇區(qū)數(shù)目眾多在尋址時比較困難,所以操作系統(tǒng)就將相鄰的扇區(qū)組合在一起,形成一個塊,再對塊進(jìn)行整體的操作,即塊是操作系統(tǒng)中最小的邏輯存儲單元。這樣可以使操作系統(tǒng)忽略底層物理存儲結(jié)構(gòu)的設(shè)計。磁盤塊是操作系統(tǒng)自己虛擬的概念,其大小由操作系統(tǒng)決定,通常一個塊 = 單個扇區(qū)大小 * 2的n次方,其中n是可修改的。
linux默認(rèn)的塊大小為4096個字節(jié),也就是8個扇區(qū)的大小。jquery/js實現(xiàn)一個網(wǎng)頁同時調(diào)用多個倒計時(最新的)
最近需要網(wǎng)頁添加多個倒計時. 查閱網(wǎng)絡(luò),基本上都是千遍一律的不好用. 自己按需寫了個.希望對大家有用. 有用請贊一個哦!
//js
//js2
var plugJs={
?? ?stamp:0,
?? ?tid:1,
?? ?stampnow:Date.parse(new Date())/1000,//統(tǒng)一開始時間戳
?? ?intervalTime:function(){
?? ??? ?if(plugJs.stamp > 0){
?? ???????? var day =www.dasheng178.com Math.floor(plugJs.stamp / (60 * 60 * 24));
?? ???????? var hour = Math.floor(plugJs.stamp / (60 * 60)) - (day * 24);
?? ???????? var minute = Math.floor(plugJs.stamp / 60) - (day * 24 * 60) - (hour * 60);
?? ???????? var second = Math.floor(plugJs.www.yinxionghui1.com/ stamp) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
?? ???????? if (day <= 9) day = '0' + day;
?? ??? ???? if (hour <= 9) hour = '0' + hour;
?? ??? ???? if (minute <= 9) minute = '0' + minute;
?? ??? ???? if (second <= 9) second = '0' + second;
?? ??? ???? jQuery('.t_h_'+plugJs.tid).html(hour);
?? ??? ???? jQuery('.t_m_'+plugJs.tid).html(minute);
?? ??? ???? jQuery('.t_s_'+plugJs.tid).html(second);
?? ??? ???? plugJs.stamp--;
?? ??? ???? setTimeout('if(www.yongshi123.cn typeof(plugJs.intervalTime) www.tianshengyuLe1.cn== "function"){plugJs.intervalTime();}',1000);
?? ???? }
?? ?},
?? ?timer:function (stampend,tid){
?? ??? ?plugJs.stamp = parseInt(stampend)-parseInt(plugJs.stampnow);//剩余時間戳
?? ??? ?setTimeout('if(typeof(plugJs.intervalTime) www.shengban1.com/ == "function"){plugJs.intervalTime();}',1000);
?? ?}
};
jQuery(document).ready(function(){
?? ?var stampend = parseInt(jQuery(www.zhongxinyul2.com'.countdown_1').attr('data-time'));//靈活讀取表里的結(jié)束時間戳
?? ?plugJs.timer(stampend,'1');
});
//html 原文http://blog.csdn.net/websites/article/details/50037611
<div class="time countdown_1" data-time="1449429731">
<span class="t_h_1">00</span>
<i class="lay_line">:</i>
<span class="t_m_1">00</span>
<i class="lay_line">:</i>
<span class="t_s_1">00</span>
</div>
<div class="time countdown_2" data-time="1449456731">
<span class="t_h_2">00</span>
<i class="lay_line">:</i>
<span class="t_m_2">00</span>
<i class="lay_line">:</i>
<span class="t_s_2">00</span>
</div>
注釋:setTimeout() 只執(zhí)行 code 一次。如果要多次調(diào)用,請使用 setInterval() 或者讓 code 自身再次調(diào)用 setTimeout()。
轉(zhuǎn)載于:https://www.cnblogs.com/qwangxiao/p/10392429.html
總結(jié)
以上是生活随笔為你收集整理的Mysql索引机制B+Tree的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于office2016和visio20
- 下一篇: HackerRank笔记 - SQL S