1. 程式人生 > >聯合索引在B+樹上的結構

聯合索引在B+樹上的結構

一級索引

二級聯合索引

假設這是一個多列索引(col1, col2,col3),對於葉子節點,是這樣的: 

PS:該圖改自《MySQL索引背後的資料結構及演算法原理》一文的配圖。

也就是說,聯合索引(col1, col2,col3)也是一棵B+Tree,其非葉子節點儲存的是第一個關鍵字的索引,而葉節點儲存的則是三個關鍵字col1、col2、col3三個關鍵字的資料,且按照col1、col2、col3的順序進行排序。

配圖可能不太讓人滿意,因為col1都是不同的,也就是說在col1就已經能確定結果了。自己又畫了一個圖(有點醜),col1表示的是年齡,col2表示的是姓氏,col3表示的是名字。如下圖: 


PS:對應地址指的是資料記錄的地址。

如圖,聯合索引(年齡, 姓氏,名字),葉節點上data域儲存的是三個關鍵字的資料。且是按照年齡、姓氏、名字的順序排列的。

因此,如果執行的是: 
select * from STUDENT where 姓氏='李' and 名字='安'; 
或者 
select * from STUDENT where 名字='安'; 
那麼當執行查詢的時候,是無法使用這個聯合索引的。因為聯合索引中是先根據年齡進行排序的。如果年齡沒有先確定,直接對姓氏和名字進行查詢的話,就相當於亂序查詢一樣,因此索引無法生效。因此查詢是全表查詢。

如果執行的是: 
select * from STUDENT where 年齡=1 and 姓氏='李';

 
那麼當執行查詢的時候,索引是能生效的,從圖中很直觀的看出,age=1的是第一個葉子節點的前6條記錄,在age=1的前提下,姓氏=’李’的是前3條。因此最終查詢出來的是這三條,從而能獲取到對應記錄的地址。 
如果執行的是: 
select * from STUDENT where 年齡=1 and 姓氏='黃' and 名字='安'; 
那麼索引也是生效的。

而如果執行的是: 
select * from STUDENT where 年齡=1 and 名字='安'; 
那麼,索引年齡部分能生效,名字部分不能生效。也就是說索引部分生效。

因此我對聯合索引結構的理解就是B+Tree是按照第一個關鍵字進行索引,然後在葉子節點上按照第一個關鍵字、第二個關鍵字、第三個關鍵字…進行排序。

最左原則

而之所以會有最左原則,是因為聯合索引的B+Tree是按照第一個關鍵字進行索引排列的。

相關推薦

聯合索引B+樹上結構介紹

前言 最近在學習MySQL的儲存引擎和索引的知識。看了許多篇介紹MyISAM和InnoDB的索引的例子,都能理解。 像這張索引圖: PS:該圖來自大神張洋的《MySQL索引背後的資料結構及演算法原理》一文。 但許多文章講述的都是單列索引,我很好奇聯合索引對應的結構圖是怎樣的。

聯合索引(複合索引)在B+樹上結構

這幾天看了B系列樹和資料庫索引相關的一些知識,看完這篇文章之後《MySQL索引背後的資料結構及演算法原理》 收穫很大,瞭解了很多知識,隨後也產生了一個想法:聯合索引 對應的 B+ 樹 是一個什麼樣子的結構。帶著這個想法各種百度 也沒得到自己想要的答案,那我就把我的想法寫下

聯合索引B+樹上結構

一級索引 二級聯合索引 假設這是一個多列索引(col1, col2,col3),對於葉子節點,是這樣的:  PS:該圖改自《MySQL索引背後的資料結構及演算法原理》一文的配圖。 也就是說,聯合索引(col1, col2,col3)也是一棵B+Tree,其非葉子節點儲存的是第一個關鍵字的索引,而葉節點儲存

聯合索引B+樹上的儲存結構及資料查詢方式

能堅持別人不能堅持的,才能擁有別人未曾擁有的。關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!! 引言 上一篇文章《MySQL索引那些事》主要講了MySQL索引的底層原理,且對比了B+Tree作為索引底層資料結構相對於其他資料結構(二叉樹、紅黑樹、B樹)的優勢,最後還通過圖示的方式描述了索引的儲存

結合B+樹,談資料庫的聯合索引

先給一個問題: 資料庫表T有A,B,C三個欄位,對其建立聯合索引uniq(A,B,C),請問如下查詢哪些會用到索引? 1. SELECT * FROM T WHERE A=a AND B=b AND C=c; 2. SELECT * FROM T WHER

資料庫索引為什麼B結構

這是一個很深的問題,我採用逐步問答的方式來解答。試圖用最簡潔的語言解決整體概念上的問題。本文目的純粹是提供對“索引採用B樹結構”這個問題的一種入門概念,不涉及深入的東西。 資料庫索引為什麼會選擇B樹結構?答:因為使用B樹查詢時,所用的磁碟IO操作次數比平衡二叉樹更少,效率

資料庫為什麼要用B+樹結構--MySQL索引結構的實現

為什麼使用B+樹?言簡意賅,就是因為: 1.檔案很大,不可能全部儲存在記憶體中,故要儲存到磁碟上 2.索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數(為什麼使用B-/+Tree,還跟磁碟存取原理有關。) 3.區域性性原理與磁碟預讀,預讀的長度一般為頁(page)的整

B-Tree索引詳解及聯合索引使用

B-tree索引(或Balanced Tree),是一種很普遍的資料庫索引結構,oracle預設的索引型別(本文也主要依據oracle來講)。其特點是定位高效、利用率高、自我平衡,特別適用於高基數字段,定位單條或小範圍資料非常高效。理論上,使用B-tree在億條資料與100條資料中定位記錄的花銷相同。資料結構

《MySQL實戰45講》學習筆記3——InnoDB為什麼採用B+樹結構實現索引

索引的作用是提高查詢效率,其實現方式有很多種,常見的索引模型有雜湊表、有序列表、搜尋樹等。 雜湊表 一種以key-value鍵值對的方式儲存資料的結構,通過指定的key可以找到對應的value。 雜湊把值放在數組裡,用一個雜湊函式把key換算成一個確定位置,然後把value放在陣列的這個位置。但是,多個ke

MySQL聯合索引

索引 基礎 找到 count 簡單 distinct update lec 技術分享 在一次查詢中,MySQL只能使用一個索引。 在真實項目中,SQL語句中的WHERE子句裏通常會包含多個查詢條件還會有排序、分組等。 若表中索引過多,會影響INSERT及UPDATE性能,

mysql 什麽時候用單列索引?什麽使用用聯合索引

order 結構 聯系 範圍 使用 建立索引 nts 創建索引 相同 我一個表 students 表,有3個字段 ,id,name,age 我要查詢 通過 name 和age,在這兩個字段 是創建 聯合索引?還是分別在nage和age上創建 單列索引呢? 多個字段查詢什麽情

程序通過定義學生結構體變量,存儲學生的學號、姓名和3門課的成績。函數fun的功能是:對形參b所指結構體變量中的數據進行修改,並在主函數中輸出修改後的數據。

一次 數據 mod long 成績 nbsp data 例如 main 程序通過定義學生結構體變量,存儲學生的學號、姓名和3門課的成績。函數fun的功能是:對形參b所指結構體變量中的數據進行修改,並在主函數中輸出修改後的數據。例如,若b所指變量t中的學號、姓名和三門課的成績

SQL Server(MySql)中的聯合主鍵(聯合索引索引分析

判斷 reat 系統 lap creat insert 結果 問題 select 最近有人問到這個問題,之前也一直沒有深究聯合索引具體使用邏輯,查閱多篇文章,並經過測試,得出一些結論 測試環境:SQL Server 2008 R2 測試結果與MySql聯合索引查詢機制類似,

web開發 c/s結構b/s結構

pan control col 用戶 模型 web 客戶 格式 一課 web開發 c/s結構 和 b/s結構 c/s結構 --client/server 客戶端/服務器機構 如qq b/s結構 -- browser/server 瀏覽器/服務器結構 如網站 mvc設計

索引(B*樹索引/位圖索引)

功能 實施 ins 情況 不同 如果 使用 大表 pda 索引功能: 1.強制實施主鍵約束和唯一約束 2.提高性能 (1)大表,用索引比較快,小表,全表掃描,比較快。 (2)排序,如果select語句包括order by、group by、union或其它一些關鍵字,則

MYSQL 什麽時候用單列索引?什麽使用用聯合索引?(收集)

img OS 所有 post 老師 tab 統計 最優 jpg 我一個表 students 表,有3個字段 ,id,name,age 我要查詢 通過 name 和age,在這兩個字段 是創建 聯合索引?還是分別在name和age上創建 單列索引呢? 多個字段查詢什麽情況下用

MySQL聯合索引最左匹配範例

HERE order xtra pack sim simple emp pan int MySQL聯合索引最左匹配範例 參考文章:http://blog.jobbole.com/24006/ 創建示例表。 示例表來自MySQL官方文檔: https://dev.mysq

單列索引聯合索引區別

csdn 搜索 fontsize 添加 lai water 描述 plain 版本 原文鏈接:https://blog.csdn.net/Abysscarry/article/details/80792876 一、聯合索引測試 註:Mysql版本為 5.7.20 我們

B/S結構,服務器端的結構分析與部分實現

生成 因此 puts kit 服務器 請求 cati 集成 servers 1.1 簡述 瀏覽器在訪問一個IP地址的時候,一般會自動在地址前方加上HTTP:// 表示其基於http協議訪問。 一般而言,http跟tcp在本質上沒有區別。 tcp連接的過程,在JAVA語言中

聯合索引

abc 高效 隨機 復合 順序 策略 完全 rom 什麽 聯合索引是什麽 對多個字段同時建立的索引(有順序,ABC,ACB是完全不同的兩種聯合索引。)為什麽要用 以聯合索引(a,b,c)為例 建立這樣的索引相當於建立了索引a、ab、abc三個索引。一個索引頂三個索引