B樹(或B-樹)和B+樹和B*樹(不看後悔,一看必懂)
樹的深度過大而造成磁碟I/O讀寫過於頻繁,進而導致查詢效率低下
根據平衡二叉樹的啟發,自然就想到平衡多路查詢樹結構,即B樹結構(後面,我們將看到,B樹的各種操作能使B樹保持較低的高度,從而達到有效避免磁碟過於頻繁的查詢存取操作,從而有效提高查詢效率)。
為什麼說B+tree比B 樹更適合實際應用中作業系統的檔案索引和資料庫索引?
1) B+tree的磁碟讀寫代價更低
B+tree的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說IO讀寫次數也就降低了。
2) B+tree的查詢效率更加穩定
由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。
B*樹分配新結點的概率比B+樹要低,空間使用率更高;
相關推薦
B樹(或B-樹)和B+樹和B*樹(不看後悔,一看必懂)
樹的深度過大而造成磁碟I/O讀寫過於頻繁,進而導致查詢效率低下 根據平衡二叉樹的啟發,自然就想到平衡多路查詢樹結構,即B樹結構(後面,我們將看到,B樹的各種操作能使B樹保持較低的高度,從而達到有效避免磁碟過於頻繁的查詢存取操作,從而有效提高查詢效率)。 為什麼說B+tre
spring bean的單例和多例的使用場景和在單例bean中注入多例(不看後悔,一看必懂)
為什麼用單例或者多例?何時用? 之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體; 之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;
spring bean的生命週期和作用域(不看後悔,一看必懂)
bean的生命週期 生命週期執行的過程如下: 1)spring在讀取xml配置檔案時對bean進行例項化,預設bean是單例 2)spring對bean進行依賴注入 3)如果bean實現了BeanNameAware介面,spring將bean的id傳給setBeanName
Spring的IOC,DI和AOP(不看後悔,一看必懂)
spring的優點 ①IOC和DI降低了元件之間的耦合性 ,讓程式設計師更專注於業務邏輯 ②容器提供了眾多的輔助類,能加快應用的開發 ③spring對於主流的應用框架提供了整合支援,如hibernate,mybatis,Struts等 ④spring屬於低侵入式設計,程式碼的汙染
JSP和Servlet的區別和聯絡(不看後悔,一看必懂)
在引入jsp之前呢,在web應用程式中,所有的業務邏輯和HTML的響應都是在Servlet中實現的.由於業務邏輯和檢視沒有分離,系統的可擴充套件性,可讀性和可維護性都較差 jsp從表面上看,就是嵌入了java程式碼的HTML檔案;本質上jsp相當於一個Servlet.只要是
什麼是長連線和短連線(不看後悔,一看必懂)
在日常專案中,大多的時候我們用的是短連線,一個請求過來,一個執行緒處理完該請求,執行緒被執行緒池回收,這個請求就關閉了.雖然這能滿足很大部分的需求,但是也有些問題,比如說:如果客戶端發的請求比較多,比較頻繁,服務端就會忙於建立連線處理請求,由於服務端的執行緒數也有限,併發比較大的話有可能會造成服
mysql中char和varchar和text的區別(不看後悔,一看必懂)
①CHAR是一種固定長度的型別,適合用在身份證號碼、手機號碼等定。,VARCHAR則是一種可變長度的型別。適合用在長度可變的屬性。 text不設定長度, 當不知道屬性的最大長度時,適合用text。 ②按照查詢速度: char最快, varchar次之,text最慢。 也就是說,
LongAdder和AtomicLong的區別(不看後悔,一看必懂)
AtomicLong的原理是依靠底層的cas來保障原子性的更新資料,在要新增或者減少的時候,會使用自循(CLH)方式不斷地cas到特定的值,從而達到更新資料的目的。然而線上程競爭激烈的情況下,自循往往浪費很多計算資源才能達成預期效果。 面對自循的缺點,jdk1.8推出了Lo
記憶體洩漏和記憶體溢位(不看後悔,一看必懂)
記憶體洩漏 記憶體洩漏是指不再被程式使用的物件或者變數還在記憶體中佔儲存空間 記憶體洩漏主要有兩種情況:一是在堆中申請的空間沒有被釋放;二是物件已經不再使用,但仍然在記憶體中保留著,垃圾回收器則無法保證不再使用的物件會被釋放.因此java語言中的記憶
Minor GC和Full GC(不看後悔,一看必懂)
1、大多數情況下,物件在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機器將發起一次MinorGC。 2、執行GC後,將存活的物件分配到Survivor空間 3、無法放到Survivor空間的物件,分配到老年代 4、分配到Survivor的物件,經過多
HTTP中的GET和POST方法有什麼區別(詳細易懂,不看後悔,一看必懂)
HTTP協議中定義了瀏覽器和伺服器進行互動的不同方法,基本方法有4種,分別是GET,POST,PUT,DELETE。這四種方法可以理解為,對伺服器資源的查,改,增,刪。但是,現在大家都不這麼幹了! 只用一個方式就可以做增刪查減的操作。 GET:從伺服器上獲取資料,也就是所謂
cookie和session(不看後悔,一看必懂)
會話:當用戶開啟瀏覽器的時候,訪問不同的資源,直到使用者將瀏覽器關閉,可以認為這是一次會話. http協議是無狀態的協議,一旦資料交換完畢,客戶端和伺服器端的連線就會關閉,再次交換資料需要建立新的連線.這就意味著伺服器無法從連線上跟蹤會話 cookie:瀏覽器端會話技
http和https的區別(不看後悔,一看必懂)
什麼是https HTTPS (基於安全套接字層的超文字傳輸協議 或者是 HTTP over SSL) 是一個 Netscape 開發的 Web 協議。 你也可以說:HTTPS = HTTP + SSL HTTPS 在 HTTP 應用層的基礎上使用安全套接字層作為子層。
http1.0和http1.1和http2.0的區別(不看後悔,一看必懂)
http1.0和http1.1的區別 ①HTTP 1.0需要使用keep-alive引數來告知伺服器端要建立一個長連線,而HTTP1.1預設支援長連線。 ②在HTTP1.0中主要使用header裡的If-Modified-Since,Expires來做為快取判斷的標準,H
hibernate相關面試題(不看後悔,一看必懂)
概述 hibernate框架應用在dao層,,hibernate的底層程式碼是jdbc,它是一個開源的輕量級的框架. hibernate通過orm思想對資料庫進行crud操作.orm中文翻譯過來就是物件關係對映,它讓實體類(就是通常所說的pojo)和資料庫表對應,讓實體類的欄位和表裡的欄
TCP的三次握手,四次揮手(不看後悔,一看必懂)
三次握手 step1:第一次握手 客戶端傳送資料包到伺服器,(在此連線請求報文段中的同步位SYN=1,確認ACK=0,表示這是一個TCP連線請求資料報文,序號seq=x,表示傳輸資料時的起始序號是x)此時,客戶端進入SYN_SENT狀態,等待伺服器確認 step2:第二次握手
長連線是如何實現的(不看後悔,一看必懂)
在HTTP1.0和HTTP1.1協議中都有對長連線的支援。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能夠支援,而HTTP1.1預設支援. http1.0請求與服務端的互動過程: &nbs
ThreadLocal詳解(不看後悔,一看必懂)
ThreadLocal概要 我們可以使用synchorinized 關鍵字來為變數加鎖以解決執行緒安全問題,從而限制只能有一個執行緒來使用此變數,但是加鎖會大大影響程式執行效率 ThreadLocal是執行緒區域性變數(從執行緒的角度看,目標變數就像是執行緒的本地變數), 通常
如何實現自己的執行緒池(不看後悔,一看必懂)
首先,在服務啟動的時候,我們可以啟動好幾個執行緒,並用一個容器(如執行緒池)來管理這些執行緒。當請求到來時,可以從池中取一個執行緒出來,執行任務(通常是對請求的響應),當任務結束後,再將這個執行緒放入池中備用;如果請求到來而池中沒有空閒的執行緒,該請求需要排隊等候。最後,當服務關閉時銷燬該池即可
ThreadPoolExecutor詳解(不看後悔,一看必懂)
構造器引數分析 第四個構造器原始碼 corePoolSize:核心池的大小 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數數目少於corePoolSize時,有新任務進來就新建一個執行緒,即使