Java开发知识点!mysql运行sql文件很慢
MySQL為何不選擇平衡二叉樹
既然平衡二叉樹解決了普通二叉樹的問題,那么mysql為何不選擇平衡二叉樹作為索引呢?
索引需要存儲(chǔ)什么
讓我們想一想,如果我們要把索引存起來,那么應(yīng)該存哪些信息呢,它應(yīng)該存儲(chǔ)三塊信息:
-
索引的值:就是表里面索引列對(duì)應(yīng)的值。
-
數(shù)據(jù)的磁盤地址(通過磁盤地址找到當(dāng)前數(shù)據(jù))或者直接存儲(chǔ)整條數(shù)據(jù)。
-
子節(jié)點(diǎn)的引用:我們需要從根節(jié)點(diǎn)往下走,所以需要知道左右子節(jié)點(diǎn)的地址。 根據(jù)這三點(diǎn),可以有如下大致的一個(gè)簡(jiǎn)單的結(jié)構(gòu)圖:
上圖中數(shù)字表示的是索引的值,0x開頭的表示磁盤地址,根節(jié)點(diǎn)中存了左右節(jié)點(diǎn)的引用。
AVL樹用來存儲(chǔ)索引存在什么問題
我們知道,頁(Page)是 Innodb 存儲(chǔ)引擎用于管理數(shù)據(jù)的最小磁盤單位,頁的默認(rèn)大小為16KB。頁也就是上圖中的節(jié)點(diǎn),每查詢一次節(jié)點(diǎn)就需要進(jìn)行一次IO操作,IO操作是一種非常耗時(shí)的操作,很多業(yè)務(wù)系統(tǒng)的瓶頸都是卡在IO操作上,所以如果我們需要提高查詢效率的辦法之一就是減少IO次數(shù),那么問題就來了,AVL樹一個(gè)節(jié)點(diǎn)上只存了一個(gè)關(guān)鍵字(索引值)+一個(gè)磁盤地址+左右節(jié)點(diǎn)的引用,這是遠(yuǎn)遠(yuǎn)達(dá)不到16KB的,會(huì)浪費(fèi)了大量的空間。
上圖中如果我們要找到6這條數(shù)據(jù),需要進(jìn)行3次IO(獲取一個(gè)節(jié)點(diǎn)就是一個(gè)IO操作),如果這棵樹很高的話,就會(huì)進(jìn)行大量的IO操作,所以說AVL樹存在的最大問題就是空間利用不足,浪費(fèi)了大量空間,數(shù)據(jù)量大的時(shí)候就會(huì)成為一顆瘦高的樹,那么我們可以怎么改進(jìn)呢?答案很明顯了,那就是每個(gè)磁盤塊多存一點(diǎn)東西,也就是說每個(gè)磁盤多存幾個(gè)關(guān)鍵字,因?yàn)殛P(guān)鍵字越多,路數(shù)越多;路數(shù)越多,樹也就越矮越胖,相應(yīng)的操作IO次數(shù)就會(huì)越少。
多路平衡樹(Balanced Tree)
多路平衡樹簡(jiǎn)稱B樹,又稱B-樹,和AVL樹一樣,B樹在枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)存儲(chǔ)鍵值、磁盤地址、左右節(jié)點(diǎn)引用。請(qǐng)看下圖的一個(gè)多路平衡樹的示例:
B樹的特點(diǎn)
相比較AVL樹,B樹一個(gè)磁盤上可以存多個(gè)關(guān)鍵字(值),而且有一個(gè)特點(diǎn)就是:
- 分叉數(shù)(路數(shù))永遠(yuǎn)比關(guān)鍵字?jǐn)?shù)多1。 我們可以畫出如下簡(jiǎn)圖(下圖中只畫了3路,即兩個(gè)關(guān)鍵字,實(shí)際取決于一頁能存儲(chǔ)多少個(gè)關(guān)鍵字):
從上圖可以很明顯的看出,同樣高度的樹,B樹能存的數(shù)據(jù)遠(yuǎn)遠(yuǎn)大于平衡二叉樹。
B樹是如何查找數(shù)據(jù)的
以上圖為例,假如我們要找key=32這個(gè)數(shù)字,首先獲取到根節(jié)點(diǎn),發(fā)現(xiàn)18小于key,所以往右邊走,獲取到右邊的數(shù)據(jù),54和76,這時(shí)候遵循以下原則:
-
key<54,命中最左邊分叉;
-
key=54,直接命中,返回?cái)?shù)據(jù);
-
54<key<76,走中間的一個(gè)分叉;
-
key=76,直接命中,返回?cái)?shù)據(jù);
-
key>76,命中右邊分支; 這里因?yàn)閗ey=32,所以走得是第1條,命中左邊分支,這時(shí)候再去獲取左邊分支,獲取到32和50,比較發(fā)現(xiàn)key=32,命中,返回?cái)?shù)據(jù)。
從上面我們可以看出B樹效率相對(duì)于AVL樹,在數(shù)據(jù)量大的情況效率已經(jīng)提高了很多,那么為什么MySQL還是不選擇B樹作為索引呢? 那么接下來讓我們先看看改良版的B+樹,然后再下結(jié)論吧!
B+樹
B+樹由B樹改良而來,屬于改良版的多路平衡查找樹。 首先讓我們來看看B+樹到底長(zhǎng)什么樣呢:
對(duì)比B+樹,我們可以發(fā)現(xiàn)一個(gè)很明顯的區(qū)別就是葉子節(jié)點(diǎn)有一個(gè)箭頭指引而且從左到右是有序的。
InnoDB中使用的B+樹相比較于傳統(tǒng)B+樹,改進(jìn)之后的B+樹具有以下特點(diǎn)
InnoDB中B+樹的特點(diǎn)
-
它的關(guān)鍵字的數(shù)量是跟路數(shù)相等的。
-
B+樹的根節(jié)點(diǎn)和枝節(jié)點(diǎn)中都不會(huì)存儲(chǔ)數(shù)據(jù),只有葉子節(jié)點(diǎn)才存儲(chǔ)數(shù)據(jù)。而搜索到關(guān)鍵字不會(huì)直接返回,會(huì)到最后一層的葉子節(jié)點(diǎn)。
-
B+樹的每個(gè)葉子節(jié)點(diǎn)增加了一個(gè)指向相鄰葉子節(jié)點(diǎn)的指針,它的最后一個(gè)數(shù)據(jù)會(huì)指向下一個(gè)葉子節(jié)點(diǎn)的第一個(gè)數(shù)據(jù),形成了一個(gè)有序鏈表的結(jié)構(gòu)。
-
它是根據(jù)左閉右開的區(qū)間來檢索數(shù)據(jù)的 按照B+樹的特點(diǎn),我們可以畫出一個(gè)存儲(chǔ)數(shù)據(jù)的簡(jiǎn)圖,如下:
總結(jié)
螞蟻面試比較重視基礎(chǔ),所以Java那些基本功一定要扎實(shí)。螞蟻的工作環(huán)境還是挺贊的,因?yàn)槲颐娴氖欠€(wěn)定性保障部門,還有許多單獨(dú)的小組,什么三年1班,很有青春的感覺。面試官基本水平都比較高,基本都P7以上,除了基礎(chǔ)還問了不少架構(gòu)設(shè)計(jì)方面的問題,收獲還是挺大的。
資料領(lǐng)取方式:戳這里
經(jīng)歷這次面試我還通過一些渠道發(fā)現(xiàn)了需要大廠真實(shí)面試主要有:螞蟻金服、拼多多、阿里云、百度、唯品會(huì)、攜程、豐巢科技、樂信、軟通動(dòng)力、OPPO、銀盛支付、中國平安等初,中級(jí),高級(jí)Java面試題集合,附帶超詳細(xì)答案,希望能幫助到大家。
主要有**:螞蟻金服、拼多多、阿里云、百度、唯品會(huì)、攜程、豐巢科技、樂信、軟通動(dòng)力、OPPO、銀盛支付、中國平安等初,中級(jí),高級(jí)Java面試題集合,附帶超詳細(xì)答案,希望能幫助到大家。
總結(jié)
以上是生活随笔為你收集整理的Java开发知识点!mysql运行sql文件很慢的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU_6078 Wavel Sequ
- 下一篇: 第5章 数据库设计