天天看點

價值2000元的Java學習資源洩露,MySQL進階,秒變大神學習分享,共勉

17、什麼是mysql聯合索引?

聯合索引是指對表上的多個列做索引。在mysql建立聯合索引時會遵循最左字首比對的原則,即最左優先,在檢索資料時從聯合索引的最左邊開始比對。

最左字首比對原則:

最左優先,在檢索資料時從聯合索引的最左邊開始比對。

對列col1、列col2和列col3建一個聯合索引:KEY test_col1_col2_col3 on test(col1,col2,col3);

聯合索引 test_col1_col2_col3 相當于建立了(col1)、(col1,col2)、(col,col2,col3)三個索引。

(1)

SELECT * FROM test WHERE col1="1" AND clo2="2" AND clo4=|"4" 

           

上面這個查詢語句執行時會依照最左字首比對原則,檢索時會使用索引(col1,col2)進行資料比對。

(2)索引的字段可以是任意順序的,如:

白嫖資料

SELECT * FROM test WHERE col1=“1” AND clo2=“2”

  SELECT * FROM test WHERE col2=“2” AND clo1=“1” 

           

這兩個查詢語句都會用到索引(col1,col2),mysql建立聯合索引的規則是首先會對聯合合索引的最左邊的,也就是第一個字段col1的資料進行排序,在第一個字段的排序基礎上,然後再對後面第二個字段col2進行排序。其實就相當于實作了類似 order by col1 col2這樣一種排序規則。

有人會疑惑第二個查詢語句不符合最左字首比對:首先可以肯定是兩個查詢語句都保函索引(col1,col2)中的col1、col2兩個字段,隻是順序不一樣,查詢條件一樣,最後所查詢的結果肯定是一樣的。既然結果是一樣的,到底以何種順序的查詢方式最好呢?此時我們可以借助mysql查詢優化器explain,explain會糾正sql語句該以什麼樣的順序執行效率最高,最後才生成真正的執行計劃。

(3)如果隻查詢col2:SELECT * FROM test WHERE col2=2;

第一個col字段是絕對有序的,而第二字段就是無序的了。是以通常情況下,直接使用第二個字段col2進行條件判斷是用不到索引的。當然是col2字段的索引資料也是有序的情況下才能使用咯,什麼時候才是有序的呢?在col1字段是等值比對的情況下,cid才是有序的。這也就是mysql索引規則中要求複合索引要想使用第二個索引,必須先使用第一個索引的原因。(而且第一個索引必須是等值比對)。

為什麼要使用聯合索引?

減少開銷。建一個聯合索引(col1,col2,col3),實際相當于建了(col1),(col1,col2),(col1,col2,col3)三個索引。每多一個索引,都會增加寫操作的開銷和磁盤空間的開銷。對于大量資料的表,使用聯合索引會大大的減少開銷!

覆寫索引。對聯合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那麼MySQL可以直接通過周遊索引取得資料,而無需回表,這減少了很多的随機io操作。減少io操作,特别的随機io其實是dba主要的優化政策。是以,在真正的實際應用中,覆寫索引是主要的提升性能的優化手段之一。

效率高。索引列越多,通過索引篩選出的資料越少。有1000W條資料的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假設假設每個條件可以篩選出10%的資料,如果隻有單值索引,那麼通過該索引能篩選出1000W10%=100w條資料,然後再回表從100w條資料中找到符合col2=2 and col3= 3的資料,然後再排序,再分頁;如果是聯合索引,通過索引篩選出1000w10% 10% *10%=1w,效率提升可想而知!

白嫖資料

從本質上來說,聯合索引還是一顆B+樹,不同的是聯合索引的鍵值的數量不是1,而是大于等于2。

對于查詢 SELECT * FROM TABLE WHERE a=xxx and b=xxx,顯然可以使用(a,b)這個聯合索引。對于單個的a列查詢 SELECT * FROM TABLE WHERE a=xxx 也是可以使用(a,b)索引。但對于b列的查詢 SELECT * FROM TABLE WHERE b=xxx 不可以使用這顆B+樹索引。因為葉節點上的b值為1,2,1,4,1,2,顯然不是排序的,是以對于b列的查詢使用不到(a,b)的索引。

聯合索引的第二個好處是,可以對第二個鍵值進行排序。例如,在很多情況下我們都需要查詢某個使用者的購物情況,并按照時間排序,去除最近3次的購買記錄,這是使用聯合索引可以避免多一次的排序操作,因為索引本身在葉節點已經排序了。

【注】:對于相同的第一個鍵值的資料,第二個鍵值是排好序的。

對于單個列a的查詢往往使用單個鍵的索引,因為其葉節點包含單個鍵值,能存放的記錄更多。

18、說一說 B+樹索引、哈希索引?

Hash索引和B+樹索引的特點:

Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位;

B+樹索引需要從根節點到枝節點,最後才能通路到頁節點這樣多次的IO通路。

Hash索引與B+樹索引差別?

如果是等值查詢,那麼哈希索引明顯有絕對優勢,因為隻需要經過一次算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據連結清單往後掃描,直到找到相應的資料;

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

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

哈希索引也不支援多列聯合索引的最左比對規則;

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

19、B樹和B+樹的差別?

B+樹是一種平衡查找樹。在B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉節點中,各葉結點指針進行連接配接。

白嫖資料

(平衡二叉樹AVL:首先符合二叉查找樹的定義(左結點的值比根節點小,右結點的值比根結點大),其次必須滿足任何節點的左右兩個子樹的高度最大差為1。)

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

B+樹:所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序連結,所有的非終端結點可以看成是索引部分。

20、為什麼說B+比B樹更适合實際應用中作業系統的檔案索引和資料庫索引?

(1)B+的磁盤讀寫代價更低

B+的内部結點并沒有指向關鍵字具體資訊的指針。是以其内部結點相對B樹更小。如果把所有同一内部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查找的關鍵字也就越多。相對來說IO讀寫次數也就降低了。

(2)B+tree的查詢效率更加穩定

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

21、聚集索引和非聚集索引差別?

資料庫中的B+索引可以分為聚集索引和輔助聚集索引。不管是聚集索引還是非聚集的索引,其内部都是B+樹的,即高度平衡的,葉節點存放着所有的資料,聚集索引與非聚集索引不同的是,葉節點存放的是否是一整行的資訊。

聚集索引(clustered index):

聚集索引就是按照每張表的主鍵構造一顆B+樹,并且葉節點中存放着整張表的行記錄資料,是以也讓聚集索引的葉節點成為資料頁。聚集索引的這個特性決定了索引組織表中資料也是索引的一部分。由于實際的資料頁隻能按照一顆B+樹進行排序,是以每張表隻能擁有一個聚集索引。

聚集索引表記錄的排列順序和索引的排列順序一緻,是以查詢效率快,隻要找到第一個索引值記錄,其餘就連續性的記錄在實體也一樣連續存放。聚集索引對應的缺點就是修改慢,因為為了保證表中記錄的實體和索引順序一緻,在記錄插入的時候,會對資料頁重新排序。

非聚集索引(nonclustered index)(也叫輔助索引):

對于輔助索引(非聚集索引),葉級别不包含行的全部資料。聚集索引鍵來告訴InnoDB存儲引擎,哪裡可以找到與索引相對應的行資料。輔助索引的存在并不影響資料在聚集索引中的組織,是以每張表上可以有多個輔助索引。通過輔助索引來尋找資料時,InnoDB存儲引擎會周遊輔助索引并通過葉級别的指針獲得指向主鍵索引的主鍵,然後再通過主鍵索引來找到一個完整的行記錄。

學習分享,共勉

這裡是小編拿到的學習資源,其中包括“中進階Java開發面試高頻考點題筆記300道.pdf”和“Java核心知識體系筆記.pdf”檔案分享,内容豐富,囊括了JVM、鎖、并發、Java反射、Spring原理、微服務、Zookeeper、資料庫、資料結構等大量知識點。同時還有Java進階學習的知識筆記腦圖(内含大量學習筆記)!

資料都是免費提供的,整理不易,有需要的朋友可以轉發分享下,同時可以關注我,定期分享學習資源還會更新一些技術分享!

資料免費領取:點選這裡即可免費擷取!

整理不易,有需要的朋友轉發支援下,感謝感謝!

Java核心知識體系筆記.pdf

價值2000元的Java學習資源洩露,MySQL進階,秒變大神學習分享,共勉

中進階Java開發面試高頻考點題筆記300道.pdf

價值2000元的Java學習資源洩露,MySQL進階,秒變大神學習分享,共勉

架構進階面試專題及架構學習筆記腦圖

價值2000元的Java學習資源洩露,MySQL進階,秒變大神學習分享,共勉

Java架構進階學習視訊分享

價值2000元的Java學習資源洩露,MySQL進階,秒變大神學習分享,共勉

661187)]

中進階Java開發面試高頻考點題筆記300道.pdf

[外鍊圖檔轉存中…(img-LvU9Qb9d-1628227661189)]

架構進階面試專題及架構學習筆記腦圖

[外鍊圖檔轉存中…(img-BBXtB0kf-1628227661191)]

Java架構進階學習視訊分享

[外鍊圖檔轉存中…(img-czkuCx65-1628227661193)]