日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql索引机制B+Tree

發(fā)布時間:2023/12/20 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql索引机制B+Tree 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。