㈠ sybase索引是用b樹還是b+樹
當創建sybase表時不帶索引,則使用堆結構存儲表。可以為表創建一個聚簇索引和多個非聚簇索引。當為表創建聚簇索引時,表中數據以索引中鍵的順序進行物理存儲。對非聚簇索引,sybase只支持b-樹結構。對每個索引,可指定填充因子和每頁必須存儲的行數,可以將單個的表和索引分布到不同的物理設備中去———實際上,可以將非聚簇表的索引頁放在與其數據獨立的物理設備上。也可以劃分表,為表創建多個「頁鏈」。劃分會減少對表的最後一頁的訪問,並允許對大型表操作時用並行i/o。
㈡ 資料庫索引文件一般採用什麼數據結構
關於資料庫索引的數據結構,大多數資料庫都是採用B樹。
1、非主鍵索引需要在數據表本身的存儲空間外額外開銷存儲空間,所以在更新的時候可能不僅要更新數據表本身,還要更新非主鍵索引,更新內容更多了,所以導致速度降低。反過來,如果數據表中的數據按照主鍵索引的順序存儲,更新的時候就沒有額外的開銷。
2、非主鍵索引對提高查詢速度來講,主要的方面是:檢索的條件(where...)如果命中對應的非主鍵索引的話,就不需要對數據表做全表掃描,效率肯定是大大提高。(索引的創建和使用是資料庫設計和優化的重要部分,是一個資料庫程序員的必修課,不同資料庫系統的語法不同,但是原理基本相同)。
3、如果檢索結果的欄位包含在非主鍵索引中,即使對非主鍵索引做全掃描,也比對整表欄位做全掃描快,因為只有非主鍵索引本身的數據需要從存儲設備調入內存,節約了IO時間。
(2)索引存儲用什麼樹擴展閱讀:
1、選擇唯一性索引 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯 一性的字 段。為該欄位建立唯一性索引可以很快的確定某個學生的信息。如果使用姓名的話,可能存 在同名現象, 從而降低查詢速度。
2、盡量使用數據量少的索引 如果索引的值很長,那麼查詢的速度會受到影響。例如,對一個CHAR(100)類型的欄位進行全文檢索 需要的時間肯定要比對CHAR(10)類型的欄位需要的時間要多。
3、盡量使用前綴來索引 如果索引欄位的值很長,最好使用值的前綴來索引。例如,TEXT和BLOG類型的欄位,進行全文檢 索會很浪費時 間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度。
㈢ 為什麼Mysql用B+樹做索引而不用B
先從數據結構的角度來答。
題主應該知道b-樹和b+樹最重要的一個區別就是b+樹只有葉節點存放數據,其餘節點用來索引,而b-樹是每個索引節點都會有data域。
這就決定了b+樹更適合用來存儲外部數據,也就是所謂的磁碟數據。
從mysql(inoodb)的角度來看,b+樹是用來充當索引的,一般來說索引非常大,尤其是關系性資料庫這種數據量大的索引能達到億級別,所以為了減少內存的佔用,索引也會被存儲在磁碟上。
那麼mysql如何衡量查詢效率呢?磁碟io次數,b-樹(b類樹)的特定就是每層節點數目非常多,層數很少,目的就是為了就少磁碟io次數,當查詢數據的時候,最好的情況就是很快找到目標索引,然後讀取數據,使用b+樹就能很好的完成這個目的,但是b-樹的每個節點都有data域(指針),這無疑增大了節點大小,說白了增加了磁碟io次數(磁碟io一次讀出的數據量大小是固定的,單個數據變大,每次讀出的就少,io次數增多,一次io多耗時啊!),而b+樹除了葉子節點其它節點並不存儲數據,節點小,磁碟io次數就少。這是優點之一。
另一個優點是什麼,b+樹所有的data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指針串起來。這樣遍歷葉子節點就能獲得全部數據,這樣就能進行區間訪問啦。
至於mongodb為什麼使用b-樹而不是b+樹,可以從它的設計角度來考慮,它並不是傳統的關系性資料庫,而是以json格式作為存儲的nosql,目的就是高性能,高可用,易擴展。首先它擺脫了關系模型,上面所述的優點2需求就沒那麼強烈了,其次mysql由於使用b+樹,數據都在葉節點上,每次查詢都需要訪問到葉節點,而mongodb使用b-樹,所有節點都有data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快於mysql(但側面來看mysql至少平均查詢耗時差不多)。
總體來說,mysql選用b+樹和mongodb選用b-樹還是以自己的需求來選擇的。
㈣ mysql索引採用什麼數據結構
文就是對這兩種數據結構做簡單的介紹。
1. B-Tree
B-Tree不是「B減樹」,而是「B樹」。
這里參考了嚴蔚敏《數據結構》對B-Tree的定義:
一棵m階的B-Tree,或者為空樹,或者滿足下列特性:
1.樹中每個結點至多有m棵子樹;
2.若根結點不是葉子結點,則至少有兩棵子樹;
3.除根節點之外的所有非終端結點至少有[m/2]棵子樹;
4.所有非終端結點中包含下列信息數據:
(n,A0,K1,A1,K2,A2……Kn,An)
其中,n為關鍵字的數目,K(i)為關鍵字,且K(i) < K(i+1), Ai為指向子樹根結點的指針,且指針A(i-1)所指子樹中所有結點的關鍵字均小於Ki,Ai所指子樹中所有結點的關鍵字均大於Ki;
5.所有葉子結點都出現在同一層次上;
下面通過一個例子解釋一下B-Tree的查找過程。
這是一棵4階的B-Tree,深度為4。
假如在該圖中查找關鍵字47,首先從根結點開始,根據根結點指針t找到*a結點,因為47大於 *a 結點的關鍵字35,所以會去A1指針指向的 *c結點繼續尋找,因為 *c的關鍵字 43 < 要查找的47 < *c結點的關鍵字78,所以去 *c結點A1指針指向的 *g結點去尋找,結果在 *g結點中找到了關鍵字47,查找成功。
2. B+Tree
不同的存儲引擎可能使用不同的數據結構存儲,InnoDB使用的是B+Tree;那什麼是B+Tree呢?
B+Tree是應文件系統所需而出的一種B-Tree的變型樹,一棵m階的B+樹和m階的B-樹的差異在於:
1.有n棵子樹的結點中含有n個關鍵字;
2.所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字的記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接;
3.所有的非終端結點可以看成是索引部分,結點中僅含有其子樹(根結點)中的最大(或最小)關鍵字;
還是通過一個例子來說明。
這個例子中,所有非終端結點僅含有子樹中最大的關鍵字。
因為葉子節點本身依據關鍵字的大小自小而大順序鏈接,所以可以從最小關鍵字起順序查找。也可以從根結點開始,進行隨機查找。
在B+樹中隨機差找和在B-樹中類似,以上圖為例。假設要查找關鍵字51,現在根節點中比較,發現51<59,因為這里使用的是非終端結點的關鍵字是子樹中最大的關鍵字,所以進入最大值為59的子結點(15\44\59)中查找,同理,因為44<51<59,所以進入P3指向的結點(51\59)中查找,然後命中關鍵字51,因為此結點(51\59)是葉子結點,所以查找終止,該結點包含指向數據的指針。
3.索引如何在B+Tree中組織數據存儲
假設有如下表:
對於表中的每一行數據,索引中包含了last_name、first_name和dob列的值,下圖展示索引是如何組織數據存儲的:
索引對多個值進行排序的依據是定義索引時列的順序。
(Allen Cuba 1960-01-01)結點左側的指針指向[?,Allen Cuba 1960-01-01)的葉子頁,(Allen Cuba 1960-01-01)和(Astaire,Angelina,1980-03-04)之間的指針指向[Allen Cuba 1960-01-01,Astaire Angelina 1980-03-04)的葉子頁,以此類推。總之,每個指針指向的結點中的最小值就是該指針左側的的值。
這種存儲結構也說明了在定義多個列組成的多列索引中,為什麼需要把重復率最低的列放到最左側,因為這會減少比較的次數,查找起來更加高效。
4.索引為什麼選用B樹這種數據結構?
因為使用B樹查找時,所用的磁碟IO操作次數比平衡二叉樹更少,效率也更高。
為什麼使用B樹查找所用的磁碟IO操作次數比平衡二叉樹更少?
大規模數據存儲中,樹節點存儲的元素數量是有限的(如果元素數量非常多的話,查找就退化成節點內部的線性查找了),這樣導致二叉查找樹結構由於樹的高度過大而造成磁碟I/O讀寫過於頻繁,進而導致查詢效率低下。那麼我們就需要減少樹的高度以提高查找效率。而平衡多路查找樹結構B樹就滿足這樣的要求。B樹的各種操作能使B樹保持較低的高度,從而達到有效減少磁碟IO操作次數。
㈤ 為什麼MongoDB採用B樹索引,而Mysql用B+樹做索引
事實上,在MySQL資料庫中,諸多存儲引擎使用的是B+樹,即便其名字看上去是BTREE。
4.1 innodb的索引機制
先以innodb存儲引擎為例,說明innodb引擎是如何利用B+樹建立索引的
首先創建一張表:zodiac,並插入一些數據
㈥ 為什麼MySQL資料庫索引選擇使用B+樹
mysql索引的數據結構,為什麼用b+樹
先從數據結構的角度來答。 題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放數據,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。 這就決定了B+樹更適合用來存儲外部數據,也就是所謂的磁碟數據。
㈦ MySQL索引使用的是什麼樹
鐵樹
㈧ mysql索引的數據結構,為什麼用b+樹
談到索引,大家並不陌生。索引本身是一種數據結構,存在的目的主要是為了縮短數據檢索的時間,最大程度減少磁碟 IO。
任何有數據的場景幾乎都有索引,比如手機通訊錄、文件系統(ext4xfs tfs)、資料庫系統(MySQLOracle)。資料庫系統和文件系統一般都採用 B+ 樹來存儲索引信息,B+ 樹兼顧寫和讀的性能,最極端時檢索復雜度為 O(logN),其中 N 指的是節點數量,logN 表示對磁碟 IO 掃描的總次數。
MySQL 支持的索引結構有四種:B+ 樹,R 樹,HASH,FULLTEXT。
B 樹是一種多叉的 AVL 樹。B-Tree 減少了 AVL 數的高度,增加了每個節點的 KEY 數量。
B 樹的特性:(m 為階數:結點的孩子個數最大值)
1. 樹中每個節點最多含有 m 個孩子節點 (m>=2);
2. 除根節點和葉子結點外,其他節點的孩子數量 >=ceil(m / 2);
3.若根節點不是葉子結點,最少有兩個孩子
特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節點;
Ki (i=1...n) 為關鍵字,且關鍵字按順序升序排序 K(i-1)< Ki
Pi 為指向兒子節點的指針,且指針 P(i-1) 指向的兒子節點里所有關鍵字均小於 Ki,但都大於 K(i-1)
關鍵字的個數 n 必須滿足:[ceil(m / 2)-1]<= n <= m-1
如果一個結點有 n 個關鍵字,那麼該結點有 n+1 個分支。這 n+1 個關鍵字按照遞增順序排列
所有葉子結點都出現在同一層,是所有遍歷的終點位置
4. 每個非葉子結點中包含有 n 個關鍵字信息:(n,P0,K1,P1,K2,P2,......,Kn,Pn) 其中:
㈨ 為什麼常見索引採用b+樹的數據結構而不是平衡二叉樹
當記錄較多時,採用平衡二叉樹就會出現深度較高的情況,這樣檢索起來O(lgN)的效率較低,而B+樹則是多路平衡樹,每個節點可以存儲多個數據,通過定位以後,如果在葉節點之前沒找到,在相應的葉子節點中通過二叉查找,效率較高。
㈩ 索引在mysql中怎麼存儲的
MySQL主要提供2種方式的索引:B-Tree(包括B+Tree)索引,Hash索引。
B-Tree的存儲方式是平衡二叉樹;
Hash索引的存儲方式是構建hash表。