B+ 樹是對(duì) B 樹的一個(gè)小升級(jí)。大部分?jǐn)?shù)據(jù)庫(kù)的索引都是基于 B+ 樹存儲(chǔ)的。MySQL 的 MyISAM 和 InnoDB 引擎的索引都是基于 B+ 樹存儲(chǔ)。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括利州網(wǎng)站建設(shè)、利州網(wǎng)站制作、利州網(wǎng)頁(yè)制作以及利州網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,利州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到利州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
B+ 樹最大的幾個(gè)特點(diǎn):
1. 非葉子節(jié)點(diǎn)只保留 KEY,放棄 DATA;
2. KEY 和 DATA一起,在葉子節(jié)點(diǎn),并且保存為一個(gè)有序鏈表(正序,反序,或者雙向);
3. B+ 樹的查找與 B 樹不同,當(dāng)某個(gè)結(jié)點(diǎn)的 KEY 與所查的 KEY 相等時(shí),并不停止查找,而是沿著這個(gè) KEY 左邊的指針向下,一直查到該關(guān)鍵字所在的葉子結(jié)點(diǎn)為止。
當(dāng)然這種結(jié)構(gòu)就不要追求什么效率了。如果要效率高的,只能改表結(jié)構(gòu)。
1:select p2.id from table p1 ,table p2 where p1.id=p2.pid and p1.id=0
2:假設(shè)表名是tree
SQL codeselect distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid =0;
select distinct a.id from tree as a inner join tree as b on (a.pid = b.pid) where b.pid =2;
3.通過(guò)程序或數(shù)據(jù)庫(kù)的store procedure來(lái)實(shí)現(xiàn)了。 在mySQL中無(wú)法以一句SQL實(shí)現(xiàn)。
表結(jié)構(gòu)
這種情況可以通過(guò)左連接實(shí)現(xiàn)
可以看到左連接是以左表為基準(zhǔn),通過(guò)關(guān)聯(lián)關(guān)系id = pid去找到對(duì)應(yīng)的上級(jí)組織記錄,所以空的id找不到對(duì)應(yīng)的記錄,返回空
有時(shí)候我們需要獲取某個(gè)組織的完整路徑 如
部門C/部門C_2/部門C_2_1/部門C_2_1_1
編寫存儲(chǔ)過(guò)程,生成一個(gè)臨時(shí)表tmpLst,按照層級(jí)把每一條記錄插入到臨時(shí)表,然后每次從臨時(shí)表查當(dāng)前層級(jí)的組織,循環(huán)去查組織表的上級(jí)組織,直到結(jié)果ROW_COUNT = 0為止,代表當(dāng)前層級(jí)下的所有組織已經(jīng)是最后一級(jí)
查詢到的結(jié)果,大家可以自行優(yōu)化一下顯示方式和查詢的字段
當(dāng)然還有另一種方式,從設(shè)計(jì)上解決
如新加一個(gè)唯一約束,把組織的約束定義為 ORG_001_ORG_001_002_ORG_001_003 這樣的形式
當(dāng)需要查詢ORG_001所有的下級(jí)時(shí),只需要查詢約束 like ORG_001% 即可
當(dāng)需要查詢ORG_001_002所有上級(jí)時(shí),只需要查詢約束 like %ORG_001_002
不過(guò)問(wèn)題在于如果組織的存在架構(gòu)調(diào)整,如,ORG_001_002調(diào)整到了 ORG_002下,因?yàn)闃湫徒Y(jié)構(gòu)變化了,直接用like無(wú)法查詢到正確數(shù)據(jù),這個(gè)時(shí)候要考慮是否允許調(diào)整或者調(diào)整后修改對(duì)應(yīng)的唯一約束