国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL索引的數(shù)據(jù)結(jié)構(gòu)

這篇具有很好參考價(jià)值的文章主要介紹了MySQL索引的數(shù)據(jù)結(jié)構(gòu)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、索引的簡(jiǎn)介

1、索引的概念

MySQL官方對(duì)索引的定義為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引
mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

索引的本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)。你可以簡(jiǎn)單理解為“排好序的快速查找數(shù)據(jù)結(jié)構(gòu)”,滿(mǎn)足特定查找算法。這些數(shù)據(jù)結(jié)構(gòu)以某種方式指向數(shù)據(jù), 這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上實(shí)現(xiàn) 高級(jí)查找算法

2、索引的優(yōu)點(diǎn)

  • 類(lèi)似大學(xué)圖書(shū)館建書(shū)目索引,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫(kù)的IO成本這也是創(chuàng)建索引最主要的原因。
  • 通過(guò)創(chuàng)建唯一索引,可以保證數(shù)據(jù)庫(kù)表中每一行 數(shù)據(jù)的唯一性 。
  • 在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面,可以 加速表和表之間的連接。換句話說(shuō),對(duì)于有依賴(lài)關(guān)系的子表和父表聯(lián)合查詢(xún)時(shí),可以提高查詢(xún)速度。
  • 在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢(xún)時(shí),可以顯著 減少查詢(xún)中分組和排序的時(shí)間 ,降低了CPU的消耗。

3、索引的缺點(diǎn)

  • 創(chuàng)建索引和維護(hù)索引要 耗費(fèi)時(shí)間 ,并且隨著數(shù)據(jù)量的增加,所耗費(fèi)的時(shí)間也會(huì)增加。
  • 索引需要占 磁盤(pán)空間 ,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間, 存儲(chǔ)在磁盤(pán)上 ,如果有大量的索引,索引文件就可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。
  • 雖然索引大大提高了查詢(xún)速度,同時(shí)卻會(huì) 降低更新表的速度 。當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)地維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

二、索引的代價(jià)

索引是個(gè)好東西,可不能亂建,它在空間和時(shí)間上都會(huì)有消耗:

1、空間上的代價(jià)

每建立一個(gè)索引都要為它建立一棵B+樹(shù),每一棵B+樹(shù)的每一個(gè)節(jié)點(diǎn)都是一個(gè)數(shù)據(jù)頁(yè),一個(gè)頁(yè)默認(rèn)會(huì)占用 16KB 的存儲(chǔ)空間,一棵很大的B+樹(shù)由許多數(shù)據(jù)頁(yè)組成,那就是很大的一片存儲(chǔ)空間。
時(shí)間上的代價(jià)

2、時(shí)間上的代價(jià)

每次對(duì)表中的數(shù)據(jù)進(jìn)行 增、刪、改 操作時(shí),都需要去修改各個(gè)B+樹(shù)索引。而且我們講過(guò),B+樹(shù)每層節(jié)點(diǎn)都是按照索引列的值 從小到大的順序排序 而組成了 雙向鏈表 。不論是葉子節(jié)點(diǎn)中的記錄,還是內(nèi)節(jié)點(diǎn)中的記錄(也就是不論是用戶(hù)記錄還是目錄項(xiàng)記錄)都是按照索引列的值從小到大的順序而形成了一個(gè)單向鏈表。而增、刪、改操作可能會(huì)對(duì)節(jié)點(diǎn)和記錄的排序造成破壞,所以存儲(chǔ)引擎需要額外的時(shí)間進(jìn)行一些 記錄移位 , 頁(yè)面分裂 、 頁(yè)面回收 等操作來(lái)維護(hù)好節(jié)點(diǎn)和記錄的排序。如果我們建了許多索引,每個(gè)索引對(duì)應(yīng)的B+樹(shù)都要進(jìn)行相關(guān)的維護(hù)操作,會(huì)給性能拖后腿。

三、InnoDB中索引的推演

1、設(shè)計(jì)索引

可以聯(lián)想操作系統(tǒng)中的頁(yè)表機(jī)制,一層套一層(通過(guò)目錄項(xiàng)找頁(yè),當(dāng)目錄項(xiàng)中過(guò)多時(shí),我們會(huì)繼續(xù)設(shè)置目錄項(xiàng)去找目錄項(xiàng)…),最后形成B+樹(shù)的形式

1)以c1創(chuàng)建索引(因?yàn)閏1是主鍵)

mysql> CREATE TABLE index_demo(
 ->   c1 INT,
 ->   c2 INT,
 ->   c3 CHAR(1),
 ->   PRIMARY KEY(c1)
 -> ) ROW_FORMAT = Compact;

2)數(shù)據(jù)庫(kù)中一條記錄的格式

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

  • record_type :記錄頭信息的一項(xiàng)屬性,表示記錄的類(lèi)型, 0 表示普通記錄、 2 表示最小記錄、 3 表示最大記錄、 1 是目錄項(xiàng)。
  • next_record:記錄頭信息的一項(xiàng)屬性,表示下一條地址相對(duì)于本條記錄的地址偏移量,我們用箭頭來(lái)表明下一條記錄是誰(shuí)。
  • 各個(gè)列的值 :這里只記錄在 index_demo 表中的三個(gè)列,分別是 c1 、 c2 和 c3 。
  • 其他信息 :除了上述3種信息以外的所有信息,包括其他隱藏列的值以及記錄的額外信息。

3)將記錄放在數(shù)據(jù)頁(yè)中

數(shù)據(jù)庫(kù)中的數(shù)據(jù)在磁盤(pán)中是以數(shù)據(jù)頁(yè)的形式進(jìn)行存儲(chǔ)的,每一頁(yè)中的每一行叫做記錄

頁(yè)內(nèi)的數(shù)據(jù)是按照主鍵值進(jìn)行排序的,所以頁(yè)內(nèi)數(shù)據(jù)我們是可以通過(guò)二分法去查找的。
mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

4)當(dāng)頁(yè)過(guò)多時(shí),需要為頁(yè)設(shè)置目錄項(xiàng)

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

5)當(dāng)目錄項(xiàng)過(guò)多時(shí),我們需要為目錄項(xiàng)設(shè)置目錄項(xiàng)

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

6)最后形成B+樹(shù)的形式

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

一個(gè)B+樹(shù)的節(jié)點(diǎn)其實(shí)可以分成好多層,規(guī)定最下邊的那層,也就是存放我們用戶(hù)記錄的那層為第 0層,之后依次往上加。之前我們做了一個(gè)非常極端的假設(shè):存放用戶(hù)記錄的頁(yè)最多存放3條記錄 ,存放目錄項(xiàng)記錄的頁(yè) 最多存放4條記錄 。其實(shí)真實(shí)環(huán)境中一個(gè)頁(yè)存放的記錄數(shù)量是非常大的(MySQL中一頁(yè)的大小為16KB),假設(shè)所有存放用戶(hù)記錄的葉子節(jié)點(diǎn)代表的數(shù)據(jù)頁(yè)可以存放100條用戶(hù)記錄,所有存放目錄項(xiàng)記錄的內(nèi)節(jié)點(diǎn)代表的數(shù)據(jù)頁(yè)可以存放1000條目錄項(xiàng)記錄 ,那么:

  • 如果B+樹(shù)只有1層,也就是只有1個(gè)用于存放用戶(hù)記錄的節(jié)點(diǎn),最多能存放 100 條記錄。
  • 如果B+樹(shù)有2層,最多能存放 1000×100=10,0000 條記錄。
  • 如果B+樹(shù)有3層,最多能存放 1000×1000×100=1,0000,0000 條記錄。
  • 如果B+樹(shù)有4層,最多能存放 1000×1000×1000×100=1000,0000,0000 條記錄。相當(dāng)多的記錄?。?!

因此,面試中問(wèn),為什么MySQL的B+樹(shù)最多只有四層?
因?yàn)樗膶泳鸵呀?jīng)能夠存儲(chǔ)相當(dāng)量的數(shù)據(jù)了,足夠我們使用,畢竟四層可以存儲(chǔ)100000000000 條記錄了。

那怎么去查找我們所需要的的記錄了?
通過(guò)主鍵值去查找某條記錄最多只需要做4個(gè)頁(yè)面內(nèi)的查找(查找3個(gè)目錄項(xiàng)頁(yè)和一個(gè)用戶(hù)記錄頁(yè)),又因?yàn)樵诿總€(gè)頁(yè)面內(nèi)有所謂的 Page Directory(頁(yè)目錄),所以在頁(yè)面內(nèi)也可以通過(guò) 二分法 實(shí)現(xiàn)快速定位記錄

2、常見(jiàn)索引概念

2.1、聚簇索引

1、特點(diǎn)

上面舉的例子是基于主鍵進(jìn)行排序的,所以是聚簇索引!

  • 使用記錄主鍵值的大小進(jìn)行記錄和頁(yè)的排序,這包括三個(gè)方面的含義:
    • 頁(yè)內(nèi) 的記錄是按照主鍵的大小順序排成一個(gè) 單向鏈表。
    • 各個(gè)存放 用戶(hù)記錄的頁(yè) 也是根據(jù)頁(yè)中用戶(hù)記錄的主鍵大小順序排成一個(gè) 雙向鏈表
    • 存放目錄項(xiàng)記錄的頁(yè) 分為不同的層次,在同一層次中的頁(yè)也是根據(jù)頁(yè)中目錄項(xiàng)記錄的主鍵大小順序排成一個(gè) 雙向鏈表。
  • B+樹(shù)的 葉子節(jié)點(diǎn) 存儲(chǔ)的是完整的用戶(hù)記錄
    所謂完整的用戶(hù)記錄,就是指這個(gè)記錄中存儲(chǔ)了所有列的值(包括隱藏列)

2、優(yōu)點(diǎn)

  • 數(shù)據(jù)訪問(wèn)更快 ,因?yàn)榫鄞厮饕龑⑺饕蛿?shù)據(jù)保存在同一個(gè)B+樹(shù)中,因此從聚簇索引中獲取數(shù)據(jù)比非聚簇索引更快
  • 聚簇索引對(duì)于主鍵的 排序查找范圍查找 速度非???/li>
  • 按照聚簇索引排列順序,查詢(xún)顯示一定范圍數(shù)據(jù)的時(shí)候,由于數(shù)據(jù)都是緊密相連,數(shù)據(jù)庫(kù)不用從多個(gè)數(shù)據(jù)塊中提取數(shù)據(jù),所以 節(jié)省了大量的io操作 。

3、缺點(diǎn)

  • 插入速度嚴(yán)重依賴(lài)于插入順序 ,按照主鍵的順序插入是最快的方式,否則將會(huì)出現(xiàn)頁(yè)分裂,嚴(yán)重影響性能。因此,對(duì)于InnoDB表,我們一般都會(huì)定義一個(gè)自增的ID列為主鍵
  • 更新主鍵的代價(jià)很高 ,因?yàn)閷?huì)導(dǎo)致被更新的行移動(dòng)。因此,對(duì)于InnoDB表,我們一般定義主鍵為不可更新
  • 二級(jí)索引訪問(wèn)需要兩次索引查找 ,第一次找到主鍵值,第二次根據(jù)主鍵值找到行數(shù)據(jù)

2.2、二級(jí)索引(又叫輔助索引、非聚簇索引)

二級(jí)索引我們并不是將主鍵作為索引,而是用非主鍵進(jìn)行索引。每一行的記錄包括非主鍵的索引和主鍵。
mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引
因此我們利用二級(jí)索引去查找某個(gè)完整的記錄,需要兩步操作,第一步,通過(guò)二級(jí)索引去查找主鍵,第二步,通過(guò)聚簇索引去查找記錄。
這就是回表操作,所以查找一條記錄我們需要查找兩棵B+索引樹(shù)!

面試問(wèn)題,為什么需要一次回表操作了?直接把完整的用戶(hù)記錄放到葉子節(jié)點(diǎn)不OK嗎?
因?yàn)樵跀?shù)據(jù)庫(kù)中不會(huì)只設(shè)置一個(gè)二級(jí)索引,如果每個(gè)二級(jí)索引的葉子結(jié)點(diǎn)都放置完整的用戶(hù)數(shù)據(jù)(每個(gè)用戶(hù)的數(shù)據(jù)可能有幾百萬(wàn)個(gè)),會(huì)極大的加大存儲(chǔ)空間的開(kāi)銷(xiāo)

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

2.3、聯(lián)合索引

我們也可以同時(shí)以多個(gè)列的大小作為排序規(guī)則,也就是同時(shí)為多個(gè)列建立索引,比方說(shuō)我們想讓B+樹(shù)按照 c2和c3列 的大小進(jìn)行排序,這個(gè)包含兩層含義:

  • 先把各個(gè)記錄和頁(yè)按照c2列進(jìn)行排序。
  • 在記錄的c2列相同的情況下,采用c3列進(jìn)行排序

注意一點(diǎn),以c2和c3列的大小為排序規(guī)則建立的B+樹(shù)稱(chēng)為 聯(lián)合索引 ,本質(zhì)上也是一個(gè)二級(jí)索引。它的意思與分別為c2和c3列分別建立索引的表述是不同的,不同點(diǎn)如下:

  • 建立 聯(lián)合索引 只會(huì)建立如上圖一樣的1棵B+樹(shù)。
  • 為c2和c3列分別建立索引會(huì)分別以c2和c3列的大小為排序規(guī)則建立2棵B+樹(shù)。

三、索引的數(shù)據(jù)結(jié)構(gòu)

1、全表遍歷

復(fù)雜度是O(n)的,效率很差

2、Hash結(jié)構(gòu)

Hash結(jié)構(gòu)的效率是很高的,時(shí)間復(fù)雜度可以為O(1)

那為什么Hash結(jié)構(gòu)的效率這么搞,那為什么索引的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)成樹(shù)形了?有四點(diǎn)原因

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

Hash索引適用存儲(chǔ)引擎如表所示:

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

雖然在InnoDB存儲(chǔ)引擎中,不支持Hash索引,但是卻提供了自適應(yīng)Hash索引(Adaptive Hash Index)。

那什么情況下使用自適應(yīng)Hash索引了?

如果某個(gè)數(shù)據(jù)經(jīng)常被訪問(wèn),當(dāng)滿(mǎn)足一定條件的時(shí)候,就會(huì)將這個(gè)數(shù)據(jù)頁(yè)的地址存放到hash表中,這樣在下次查詢(xún)的時(shí)候,就可以找到這個(gè)頁(yè)面所在的位置。這樣B+樹(shù)也具備了Hash索引的優(yōu)點(diǎn)。

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引
采用自適應(yīng) Hash 索引目的是方便根據(jù) SQL 的查詢(xún)條件加速定位到葉子節(jié)點(diǎn),特別是當(dāng) B+ 樹(shù)比較深的時(shí)候,通過(guò)自適應(yīng) Hash 索引可以明顯提高數(shù)據(jù)的檢索效率。

我們可以通過(guò)innodb_adaptive_hash_index變量來(lái)查看是否開(kāi)啟了自適應(yīng) Hash,比如:

show variables like '%adaptive_hash_index';

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

3、二插搜索樹(shù)

二插搜索樹(shù)在某種情況下,時(shí)間復(fù)雜度會(huì)變成O(n)
mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引
為了提高查詢(xún)效率,就需要 減少磁盤(pán)IO數(shù) 。為了減少磁盤(pán)IO的次數(shù),就需要盡量 降低樹(shù)的高度 ,需要把原來(lái)“瘦高”的樹(shù)結(jié)構(gòu)變的“矮胖”,樹(shù)的每層的分叉越多越好。

4、AVL樹(shù)

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引

5、 B樹(shù)

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引
一個(gè) M 階的 B 樹(shù)(M>2)有以下的特性:

(1)根節(jié)點(diǎn)的兒子數(shù)的范圍是 [2,M]。
(2)每個(gè)中間節(jié)點(diǎn)包含 k-1 個(gè)關(guān)鍵字和 k 個(gè)孩子,孩子的數(shù)量 = 關(guān)鍵字的數(shù)量 +1,k 的取值范圍為[ceil(M/2), M]。
(3)葉子節(jié)點(diǎn)包括 k-1 個(gè)關(guān)鍵字(葉子節(jié)點(diǎn)沒(méi)有孩子),k 的取值范圍為 [ceil(M/2), M]。
(4)假設(shè)中間節(jié)點(diǎn)節(jié)點(diǎn)的關(guān)鍵字為:Key[1], Key[2], …, Key[k-1],且關(guān)鍵字按照升序排序,即 Key[i]
<Key[i+1]。此時(shí) k-1 個(gè)關(guān)鍵字相當(dāng)于劃分了 k 個(gè)范圍,也就是對(duì)應(yīng)著 k 個(gè)指針,即為:P[1], P[2], >…,P[k],其中 P[1] 指向關(guān)鍵字小于 Key[1] 的子樹(shù),P[i] 指向關(guān)鍵字屬于 (Key[i-1], Key[i]) 的子樹(shù),P[k]>指向關(guān)鍵字大于 Key[k-1] 的子樹(shù)。
(4)所有葉子節(jié)點(diǎn)位于同一層。

上面那張圖所表示的 B 樹(shù)就是一棵 3 階的 B 樹(shù)。我們可以看下磁盤(pán)塊 2,里面的關(guān)鍵字為(8,12),它有 3 個(gè)孩子 (3,5),(9,10) 和 (13,15),你能看到 (3,5) 小于 8,(9,10) 在 8 和 12 之間,而 (13,15)大于 12,剛好符合剛才我們給出的特征。

然后我們來(lái)看下如何用 B 樹(shù)進(jìn)行查找。假設(shè)我們想要 查找的關(guān)鍵字是 9 ,那么步驟可以分為以下幾步

  • (1)我們與根節(jié)點(diǎn)的關(guān)鍵字 (17,35)進(jìn)行比較,9 小于 17 那么得到指針 P1;
  • (2)按照指針 P1 找到磁盤(pán)塊 2,關(guān)鍵字為(8,12),因?yàn)?9 在 8 和 12 之間,所以我們得到指針 P2;
  • (3)按照指針 P2 找到磁盤(pán)塊 6,關(guān)鍵字為(9,10),然后我們找到了關(guān)鍵字 9。

你能看出來(lái)在 B 樹(shù)的搜索過(guò)程中,我們比較的次數(shù)并不少,但如果把數(shù)據(jù)讀取出來(lái)然后在內(nèi)存中進(jìn)行比較,這個(gè)時(shí)間就是可以忽略不計(jì)的。而讀取磁盤(pán)塊本身需要進(jìn)行 I/O 操作,消耗的時(shí)間比在內(nèi)存中進(jìn)行比較所需要的時(shí)間要多,是數(shù)據(jù)查找用時(shí)的重要因素。 B 樹(shù)相比于平衡二叉樹(shù)來(lái)說(shuō)磁盤(pán) I/O 操作要少,在數(shù)據(jù)查詢(xún)中比平衡二叉樹(shù)效率要高。所以 只要樹(shù)的高度足夠低,IO次數(shù)足夠少,就可以提高查詢(xún)性能

6、B+樹(shù)

1、B+樹(shù)和B樹(shù)的差異

  • B+樹(shù)有 k 個(gè)孩子的節(jié)點(diǎn)就有 k 個(gè)關(guān)鍵字。也就是孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù),而 B 樹(shù)中,孩子數(shù)量 = 關(guān)鍵字?jǐn)?shù)+1。
  • B+樹(shù)中,非葉子節(jié)點(diǎn)的關(guān)鍵字也會(huì)同時(shí)存在在子節(jié)點(diǎn)中,并且是在子節(jié)點(diǎn)中所有關(guān)鍵字的最大(或最小)。
  • B+樹(shù)中,非葉子節(jié)點(diǎn)僅用于索引,不保存數(shù)據(jù)記錄,跟記錄有關(guān)的信息都放在葉子節(jié)點(diǎn)中。而 B 樹(shù)中, 非葉子節(jié)點(diǎn)既保存索引,也保存數(shù)據(jù)記錄 。
  • 所有關(guān)鍵字都在葉子節(jié)點(diǎn)出現(xiàn),葉子節(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表,而且葉子節(jié)點(diǎn)本身按照關(guān)鍵字的大小從小到大順序鏈接。

2、B+樹(shù)就比B樹(shù)好嗎?

B 樹(shù)和 B+ 樹(shù)都可以作為索引的數(shù)據(jù)結(jié)構(gòu),在 MySQL 中采用的是 B+ 樹(shù)。但B樹(shù)和B+樹(shù)各有自己的應(yīng)用場(chǎng)景,不能說(shuō)B+樹(shù)完全比B樹(shù)好,反之亦然。

3 、思考題:為了減少I(mǎi)O,索引樹(shù)會(huì)一次性加載嗎?

不會(huì),因?yàn)樗饕龝?huì)占用空間,大量的索引可能會(huì)超出1g多的大小,所以不會(huì)一次性加載

4、思考題:B+樹(shù)的存儲(chǔ)能力如何?為何說(shuō)一般查找行記錄,最多只需1~3次磁盤(pán)IO

儲(chǔ)存能力很強(qiáng),倘若一開(kāi)始的根頁(yè)可以存放100條數(shù)據(jù)條目,那如果頁(yè)目錄可以存放1000條,那二級(jí)存放的量就1001000,三級(jí)就是10010001000,4級(jí)就是100100010001000,那為什么最多只需要加載最大3次呢,因?yàn)楦?yè)的數(shù)據(jù)在一開(kāi)始已經(jīng)加載了所有無(wú)需加載,那么就算最大加載4級(jí),那也就需要加載最大3次

5、思考題:為什么說(shuō)B+樹(shù)比B-樹(shù)更適合實(shí)際應(yīng)用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫(kù)索引?

因?yàn)锽+樹(shù)查詢(xún)更為穩(wěn)定,且適合范圍的快速查找

6、思考題:Hash 索引與 B+ 樹(shù)索引的區(qū)別

HASH索引的范圍查找效率比B+樹(shù)索引效率低很多,且不支持聯(lián)合索引

7、思考題:Hash 索引與 B+ 樹(shù)索引是在建索引的時(shí)候手動(dòng)指定的嗎?

不是的,是一開(kāi)始我們創(chuàng)建表的時(shí)候,每次插入數(shù)據(jù),他背后都會(huì)去維護(hù)對(duì)應(yīng)索引,如果又新加的二級(jí)索引才會(huì)再創(chuàng)建索引

7、R樹(shù)

R-Tree在MySQL很少使用,僅支持 geometry數(shù)據(jù)類(lèi)型 ,支持該類(lèi)型的存儲(chǔ)引擎只有myisam、bdb、innodb、ndb、archive幾種。

舉個(gè)R樹(shù)在現(xiàn)實(shí)領(lǐng)域中能夠解決的例子:查找20英里以?xún)?nèi)所有的餐廳。如果沒(méi)有R樹(shù)你會(huì)怎么解決?一般情況下我們會(huì)把餐廳的坐標(biāo)(x,y)分為兩個(gè)字段存放在數(shù)據(jù)庫(kù)中,一個(gè)字段記錄經(jīng)度,另一個(gè)字段記錄緯度。這樣的話我們就需要遍歷所有的餐廳獲取其位置信息,然后計(jì)算是否滿(mǎn)足要求。如果一個(gè)地區(qū)有100家餐廳的話,我們就要進(jìn)行100次位置計(jì)算操作了,如果應(yīng)用到谷歌、百度地圖這種超大數(shù)據(jù)庫(kù)中,這種方法便必定不可行了。R樹(shù)就很好的解決了這種高維空間搜索問(wèn)題。它把B樹(shù)的思想很好的擴(kuò)展到了多維空間,采用了B樹(shù)分割空間的思想,并在添加、刪除操作時(shí)采用合并、分解結(jié)點(diǎn)的方法,保證樹(shù)的平衡性。因此,R樹(shù)就是一棵用來(lái)存儲(chǔ)高維數(shù)據(jù)的平衡樹(shù) 。相對(duì)于B-Tree,R-Tree的優(yōu)勢(shì)在于范圍查找

mysql索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù),MySQL,索引文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-621507.html

四、索引的適用和不適用場(chǎng)景

1、適用場(chǎng)景

  • 主鍵自動(dòng)建立唯一索引
  • 頻繁作為查詢(xún)的條件的字段應(yīng)該創(chuàng)建索引
  • 查詢(xún)中與其他表關(guān)聯(lián)的字段
  • 頻繁更新的字段不適合創(chuàng)建索引
  • 查詢(xún)中排序的字段,排序字段若通過(guò)索引去訪問(wèn)將大大提高排序的速度
  • 查詢(xún)中統(tǒng)計(jì)或者分組字段

2、不適用場(chǎng)景

  • Where條件里用不到的字段不創(chuàng)建索引
  • 表記錄太少
  • 經(jīng)常增刪改的表
  • 數(shù)據(jù)重復(fù)且分布平均的表字段

到了這里,關(guān)于MySQL索引的數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Mysql數(shù)據(jù)庫(kù)結(jié)構(gòu)優(yōu)化匯總

    ? ? ?設(shè)計(jì)表以最大限度地減少其在磁盤(pán)上的空間。這可以減少寫(xiě)入磁盤(pán)和從磁盤(pán)讀取的數(shù)據(jù)量,從而帶來(lái)巨大的改進(jìn)。較小的表通常需要較少的主內(nèi)存,而它們的內(nèi)容在查詢(xún)執(zhí)行過(guò)程中被主動(dòng)處理。表數(shù)據(jù)的任何空間減少也會(huì)導(dǎo)致更小的索引可以更快地處理。 盡可能使用最

    2024年02月07日
    瀏覽(23)
  • Mysql不同數(shù)據(jù)庫(kù)之間表結(jié)構(gòu)同步

    Mysql不同數(shù)據(jù)庫(kù)之間表結(jié)構(gòu)同步

    開(kāi)發(fā)環(huán)境的Mysql表結(jié)構(gòu)做了修改,要同步到其他環(huán)境數(shù)據(jù)庫(kù)中使用數(shù)據(jù)庫(kù)管理工具JookDB的表結(jié)構(gòu)同步功能就很方便。雖然Navicat也有這個(gè)功能但是有免費(fèi)的當(dāng)然是用免費(fèi)的。 用JookDB添加數(shù)據(jù)庫(kù)后在數(shù)據(jù)庫(kù)節(jié)點(diǎn)上右鍵選擇“同步結(jié)構(gòu)”即可開(kāi)始表結(jié)構(gòu)同步。 1.選擇結(jié)構(gòu)同步的源庫(kù)

    2024年02月05日
    瀏覽(24)
  • 【數(shù)據(jù)庫(kù)——MySQL(實(shí)戰(zhàn)項(xiàng)目1)】(1)圖書(shū)借閱系統(tǒng)——數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)

    【數(shù)據(jù)庫(kù)——MySQL(實(shí)戰(zhàn)項(xiàng)目1)】(1)圖書(shū)借閱系統(tǒng)——數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)

    經(jīng)過(guò)前期的學(xué)習(xí),我們已經(jīng)掌握數(shù)據(jù)庫(kù)基礎(chǔ)操作,因此是時(shí)候來(lái)做一個(gè)實(shí)戰(zhàn)項(xiàng)目了—— 圖書(shū)借閱系統(tǒng) 。對(duì)于圖書(shū)借閱系統(tǒng),相信大家不難想到至少需要 3 張表,分別是: 借閱人表 , 圖書(shū)表 和 借閱信息表 (當(dāng)然不限于這些表,大家可以根據(jù)自己的想法創(chuàng)建其它表)。 那么

    2024年02月03日
    瀏覽(33)
  • MySql數(shù)據(jù)庫(kù)的初步安裝與數(shù)據(jù)表結(jié)構(gòu)數(shù)據(jù)管理

    MySql數(shù)據(jù)庫(kù)的初步安裝與數(shù)據(jù)表結(jié)構(gòu)數(shù)據(jù)管理

    目錄 一、數(shù)據(jù)庫(kù)的相關(guān)了解 1)數(shù)據(jù)庫(kù)的概念? 數(shù)據(jù)(Data) 表 數(shù)據(jù)庫(kù)系統(tǒng) 2)數(shù)據(jù)庫(kù)系統(tǒng)發(fā)展史 第一代數(shù)據(jù)庫(kù) 第二代數(shù)據(jù)庫(kù) 第三代數(shù)據(jù)庫(kù) 當(dāng)今主流數(shù)據(jù)庫(kù)介紹 2)數(shù)據(jù)庫(kù)的分類(lèi)? 關(guān)系數(shù)據(jù)庫(kù) 非關(guān)系型數(shù)據(jù)庫(kù) 非關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn) 二、mysql的yum安裝與源碼編譯安裝?? 1)源

    2024年02月08日
    瀏覽(2720)
  • MySQL數(shù)據(jù)庫(kù)精選(從入門(mén)使用到底層結(jié)構(gòu))

    MySQL數(shù)據(jù)庫(kù)精選(從入門(mén)使用到底層結(jié)構(gòu))

    DDL: 數(shù)據(jù)定義語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象(數(shù)據(jù)庫(kù)、表、字段) DML: 數(shù)據(jù)操作語(yǔ)言,用來(lái)對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行增刪改 DQL: 數(shù)據(jù)查詢(xún)語(yǔ)言,用來(lái)查詢(xún)數(shù)據(jù)庫(kù)中表的記錄 DCL: 數(shù)據(jù)控制語(yǔ)言,用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)用戶(hù)、控制數(shù)據(jù)庫(kù)的控制權(quán)限 數(shù)據(jù)定義語(yǔ)言 數(shù)據(jù)庫(kù)操作 查詢(xún)所有數(shù)據(jù)

    2024年02月19日
    瀏覽(25)
  • mysql從入門(mén)到放棄之?dāng)?shù)據(jù)庫(kù)體系結(jié)構(gòu)與管理

    mysql從入門(mén)到放棄之?dāng)?shù)據(jù)庫(kù)體系結(jié)構(gòu)與管理

    第一篇文章中主要學(xué)習(xí)了mysql二進(jìn)制的基本安裝及數(shù)據(jù)庫(kù)初始化等操作,本篇文章主要了解mysql的體系結(jié)構(gòu)和管理,例如: mysql的實(shí)例組成、邏輯存儲(chǔ)結(jié)構(gòu)、物理存儲(chǔ)結(jié)構(gòu)等方面展開(kāi)學(xué)習(xí) 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 3.1、mysqld守護(hù)進(jìn)程結(jié)構(gòu) 3.2、 引入sql語(yǔ)句

    2024年01月21日
    瀏覽(88)
  • MySQL數(shù)據(jù)庫(kù)---庫(kù)基本操作 以及 表結(jié)構(gòu)的操作(DDL)

    MySQL數(shù)據(jù)庫(kù)---庫(kù)基本操作 以及 表結(jié)構(gòu)的操作(DDL)

    目錄 前言 一.數(shù)據(jù)庫(kù)的操作 1.1顯示當(dāng)前數(shù)據(jù)庫(kù) 1.2創(chuàng)建數(shù)據(jù)庫(kù) 1.3使用數(shù)據(jù)庫(kù)? 1.4刪除數(shù)據(jù)庫(kù) ?二.數(shù)據(jù)類(lèi)型 2.1數(shù)值類(lèi)型 2.2字符串類(lèi)型 2.3日期類(lèi)型 三.數(shù)據(jù)表的操作 ?3.1?創(chuàng)建表結(jié)構(gòu)。 ?3.2查看數(shù)據(jù)庫(kù)中擁有的數(shù)據(jù)表 ?3.3查看指定的表結(jié)構(gòu) ??3.4修改表結(jié)構(gòu) ??3.5刪除表結(jié)構(gòu) ?

    2024年02月09日
    瀏覽(21)
  • MySQL的數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)庫(kù)(Database)、表(Table)、記錄(Record)和字段(Field)

    MySQL的數(shù)據(jù)結(jié)構(gòu)可以看作是一個(gè)層次化的組織方式,從最高的層次到最低的層次分別是:數(shù)據(jù)庫(kù)(Database)、表(Table)、記錄(Record,也就是數(shù)據(jù)行)和字段(Field,也就是數(shù)據(jù)列)。 數(shù)據(jù)庫(kù)(Database) : 數(shù)據(jù)庫(kù)是最高層次的存儲(chǔ)結(jié)構(gòu),它可以包含多個(gè)表、視圖、存儲(chǔ)過(guò)程、

    2024年02月21日
    瀏覽(29)
  • MySQL高級(jí)第十一篇:數(shù)據(jù)庫(kù)調(diào)優(yōu)策略(定位-調(diào)優(yōu)-結(jié)構(gòu))

    MySQL高級(jí)第十一篇:數(shù)據(jù)庫(kù)調(diào)優(yōu)策略(定位-調(diào)優(yōu)-結(jié)構(gòu))

    1.盡可能節(jié)省系統(tǒng)資源,以便系統(tǒng)可以提供更大負(fù)荷的服務(wù)。 (吞吐量更大) 2.合理的結(jié)構(gòu)設(shè)計(jì)和參數(shù)調(diào)整,以提高用戶(hù)操作響應(yīng)的速度。 (響應(yīng)速度更快) 3.減少系統(tǒng)的瓶頸,提高M(jìn)ySQL數(shù)據(jù)庫(kù)整體的性能。 用戶(hù)是我們的服務(wù)對(duì)象,因此他們的反饋是最直接的。雖然他們不會(huì)

    2023年04月10日
    瀏覽(32)
  • 數(shù)據(jù)庫(kù)索引結(jié)構(gòu)(1)概念

    數(shù)據(jù)庫(kù)索引結(jié)構(gòu)(1)概念

    MySQL學(xué)習(xí)筆記-主鍵索引和二級(jí)索引_mysql中主鍵索引和二級(jí)索引的區(qū)別_愛(ài)因詩(shī)賢的博客-CSDN博客?MYSQL-主鍵索引與二級(jí)索引_mysql二級(jí)索引存在哪個(gè)文件_青苔小榭的博客-CSDN博客 ? ? ? 采用主鍵索引的好處:如果元素的位置發(fā)生修改,那么查找的復(fù)雜度沒(méi)有變化 因?yàn)橹皇歉鶕?jù)主鍵

    2024年02月06日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包