資料庫面試知識點彙總 三

2021-09-02 23:00:40 字數 4564 閱讀 2253

1.什麼是索引?

何為索引:資料庫索引,是資料庫管理系統中乙個排序的資料結構,索引的實現通常使用b樹及其變種b+樹。

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。

2.索引的作用?它的優點缺點是什麼?

索引作用:協助快速查詢、更新資料庫表中資料。

為表設定索引要付出代價的:

建立索引可以大大提高系統的效能(優點):

1.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

2.可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

3.可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

4.在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

5.通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

增加索引也有許多不利的方面(缺點):

1.建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

2.索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

3.當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

4.哪些列適合建立索引、哪些不適合建索引?

索引是建立在資料庫表中的某些列的上面。在建立索引的時候,應該考慮在哪些列上可以建立索引,在哪些列上不能建立索引。

一般來說,應該在這些列上建立索引:

(1)在經常需要搜尋的列上,可以加快搜尋的速度;

(2)在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;

(3)在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;

(4)在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;

(5)在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

(6)在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。

對於有些列不應該建立索引:

(1)對於那些在查詢中很少使用或者參考的列不應該建立索引。

這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

(2)對於那些只有很少資料值的列也不應該增加索引。

這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。

(3)對於那些定義為text, image和bit資料型別的列不應該增加索引。

這是因為,這些列的資料量要麼相當大,要麼取值很少。

(4)當修改效能遠遠大於檢索效能時,不應該建立索引。

這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

5.什麼樣的字段適合建索引

一、不為空、經常被查詢的字段

6.mysql b+tree索引和hash索引的區別?

hash索引和b+樹索引的特點:

為什麼不都用hash索引而使用b+樹索引?

hash索引僅僅能滿足"=","in"和""查詢,不能使用範圍查詢,因為經過相應的hash演算法處理之後的hash值的大小關係,並不能保證和hash運算前完全一樣;

hash索引無法被用來避免資料的排序操作,因為hash值的大小關係並不一定和hash運算前的鍵值完全一樣;

hash索引不能利用部分索引鍵查詢,對於組合索引,hash索引在計算hash值的時候是組合索引鍵合併後再一起計算hash值,而不是單獨計算hash值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash索引也無法被利用;

hash索引在任何時候都不能避免表掃瞄,由於不同索引鍵存在相同hash值,所以即使取滿足某個hash鍵值的資料的記錄條數,也無法從hash索引中直接完成查詢,還是要回表查詢資料;

hash索引遇到大量hash值相等的情況後效能並不一定就會比b+樹索引高。

補充:

1.mysql中,只有heap/memory引擎才顯示支援hash索引。

2.常用的innodb引擎中預設使用的是b+樹索引,它會實時監控表上索引的使用情況,如果認為建立雜湊索引可以提高查詢效率,則自動在記憶體中的「自適應雜湊索引緩衝區」建立雜湊索引(在innodb中預設開啟自適應雜湊索引),通過觀察搜尋模式,mysql會利用index key的字首建立雜湊索引,如果乙個表幾乎大部分都在緩衝池中,那麼建立乙個雜湊索引能夠加快等值查詢。

b+樹索引和雜湊索引的明顯區別是:

3.如果是等值查詢,那麼雜湊索引明顯有絕對優勢,因為只需要經過一次演算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據鍊錶往後掃瞄,直到找到相應的資料;

4.如果是範圍查詢檢索,這時候雜湊索引就毫無用武之地了,因為原先是有序的鍵值,經過雜湊演算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索;

同理,雜湊索引沒辦法利用索引完成排序,以及like 『***%』 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢);

5.雜湊索引也不支援多列聯合索引的最左匹配規則;

6.b+樹索引的關鍵字檢索效率比較平均,不像b樹那樣波動幅度大,在有大量重複鍵值情況下,雜湊索引的效率也是極低的,因為存在所謂的雜湊碰撞問題。

7.在大多數場景下,都會有範圍查詢、排序、分組等查詢特徵,用b+樹索引就可以了。

7.b樹和b+樹的區別

b樹,每個節點都儲存key和data,所有節點組成這棵樹,並且葉子節點指標為nul,葉子結點不包含任何關鍵字資訊。

b+樹,所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序鏈結,所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而b 樹的非終節點也包含需要查詢的有效資訊)

8.為什麼說b+比b樹更適合實際應用中作業系統的檔案索引和資料庫索引?

1.b+的磁碟讀寫代價更低b+的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對b樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說io讀寫次數也就降低了。

2.b+tree的查詢效率更加穩定

由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。

9.聚集索引和非聚集索引區別?

聚合索引(clustered index):聚集索引表記錄的排列順序和索引的排列順序一致,所以查詢效率快,只要找到第乙個索引值記錄,其餘就連續性的記錄在物理也一樣連續存放。聚集索引對應的缺點就是修改慢,因為為了保證表中記錄的物理和索引順序一致,在記錄插入的時候,會對資料頁重新排序。

聚集索引類似於新華字典中用拼音去查詢漢字,拼音檢索表於書記順序都是按照a~z排列的,就像相同的邏輯順序於物理順序一樣,當你需要查詢a,ai兩個讀音的字,或是想一次尋找多個傻(sha)的同音字時,也許向後翻幾頁,或緊接著下一行就得到結果了。

非聚合索引(nonclustered index):

非聚集索引指定了表中記錄的邏輯順序,但是記錄的物理和索引不一定一致,兩種索引都採用b+樹結構,非聚集索引的葉子層並不和實際資料頁相重疊,而採用葉子層包含乙個指向表中的記錄在資料頁中的指標方式。非聚集索引層次多,不會造成資料重排。

非聚集索引類似在新華字典上通過偏旁部首來查詢漢字,檢索表也許是按照橫、豎、撇來排列的,但是由於正文中是a~z的拼音順序,所以就類似於邏輯位址於實體地址的不對應。同時適用的情況就在於分組,大數目的不同值,頻繁更新的列中,這些情況即不適合聚集索引。

根本區別:

聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。

關係型資料庫面試知識點彙總

本文目錄結構 資料庫基礎知識 什麼是sql?什麼是資料庫?什麼是dbms?為什麼要使用資料庫?資料庫的分類 主流關係型資料庫簡介 什麼是資料庫的三大正規化?什麼是資料庫的五大約束?主鍵 預設 唯 一 檢查 外來鍵 mysql與許可權相關的表有哪些?user,db,host,表,列 mysql的bin...

面試聚合知識點彙總

cas 在判斷陣列中當前位置為null的時候,使用cas來把這個新的node寫入陣列中對應的位置 synchronized 當陣列中的指定位置不為空時,通過加鎖來新增這個節點進入陣列 鍊錶 8 或者是紅黑樹 鍊錶 8 詳細過程看下面原始碼 執行緒安全版的arraylist的效能比較 collecti...

資料庫知識點

1.truncate delete和drop delete delete是一行行刪除資料,不影響表結構,並且會記錄日誌,可以進行回滾。truncate 刪除表中所有資料,不記錄日誌,不可以回滾,truncate之後表空間和索引大小會回到初始值。所以truncate之前最好備份 drop 刪除整個表結...