偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

終于有人將MySQL索引講清楚了

數(shù)據(jù)庫 MySQL
看了很多關(guān)于索引的博客,講的大同小異。但是始終沒有讓我明白關(guān)于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....

[[269772]]

01、前言

看了很多關(guān)于索引的博客,講的大同小異。但是始終沒有讓我明白關(guān)于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....

或許有很多人和我一樣,沒搞清楚概念就開始研究B-Tree,B+Tree等結(jié)構(gòu),導(dǎo)致在面試的時(shí)候答非所問!

索引是什么?

索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。

索引能干什么?

提高數(shù)據(jù)查詢的效率。

索引:排好序的快速查找數(shù)據(jù)結(jié)構(gòu)!索引會(huì)影響where后面的查找,和order by 后面的排序。

02、索引的分類

  1. 從存儲(chǔ)結(jié)構(gòu)上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
  2. 從應(yīng)用層次來分:普通索引,唯一索引,復(fù)合索引
  3. 根據(jù)中數(shù)據(jù)的物理順序與鍵值的邏輯(索引)順序關(guān)系:聚集索引,非聚集索引。

***點(diǎn)描述的是索引存儲(chǔ)時(shí)保存的形式,第二點(diǎn)是索引使用過程中進(jìn)行的分類,兩者是不同層次上的劃分。不過平時(shí)講的索引類型一般是指在應(yīng)用層次的劃分。

就像手機(jī)分類:安卓手機(jī),IOS手機(jī) 與 華為手機(jī),蘋果手機(jī),OPPO手機(jī)一樣。

普通索引:即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引

唯一索引:索引列的值必須唯一,但允許有空值

復(fù)合索引:即一個(gè)索引包含多個(gè)列

聚簇索引(聚集索引):并不是一種單獨(dú)的索引類型,而是一種數(shù)據(jù)存儲(chǔ)方式。具體細(xì)節(jié)取決于不同的實(shí)現(xiàn),InnoDB的聚簇索引其實(shí)就是在同一個(gè)結(jié)構(gòu)中保存了B-Tree索引(技術(shù)上來說是B+Tree)和數(shù)據(jù)行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(認(rèn)真臉)。

03、索引的底層實(shí)現(xiàn)

mysql默認(rèn)存儲(chǔ)引擎innodb只顯式支持B-Tree( 從技術(shù)上來說是B+Tree)索引,對(duì)于頻繁訪問的表,innodb會(huì)透明建立自適應(yīng)hash索引,即在B樹索引基礎(chǔ)上建立hash索引,可以顯著提高查找效率,對(duì)于客戶端是透明的,不可控制的,隱式的。不談存儲(chǔ)引擎,只討論實(shí)現(xiàn)(抽象)

Hash索引

基于哈希表實(shí)現(xiàn),只有精確匹配索引所有列的查詢才有效。

對(duì)于每一行數(shù)據(jù),存儲(chǔ)引擎都會(huì)對(duì)所有的索引列計(jì)算一個(gè)哈希碼(hash code),并且Hash索引將所有的哈希碼存儲(chǔ)在索引中,同時(shí)在索引表中保存指向每個(gè)數(shù)據(jù)行的指針。

終于有人將 MySQL 索引講清楚了

 

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快數(shù)據(jù)的訪問速度,因?yàn)榇鎯?chǔ)引擎不再需要進(jìn)行全表掃描來獲取數(shù)據(jù),數(shù)據(jù)分布在各個(gè)節(jié)點(diǎn)之中。

終于有人將 MySQL 索引講清楚了

 

B+Tree索引

是B-Tree的改進(jìn)版本,同時(shí)也是數(shù)據(jù)庫索引所采用的存儲(chǔ)結(jié)構(gòu)。

數(shù)據(jù)都在葉子節(jié)點(diǎn)上,并且增加了順序訪問指針,每個(gè)葉子節(jié)點(diǎn)都指向相鄰的葉子節(jié)點(diǎn)的地址。

相比B-Tree來說,進(jìn)行范圍查找時(shí)只需要查找兩個(gè)節(jié)點(diǎn),進(jìn)行遍歷即可。而B-Tree需要獲取所有節(jié)點(diǎn),相比之下B+Tree效率更高。

終于有人將 MySQL 索引講清楚了

 

結(jié)合存儲(chǔ)引擎來討論(一般默認(rèn)使用B+Tree)

 

案例:假設(shè)有一張學(xué)生表,id為主鍵 

id name birthday
001 Tom 1996-01-01
002 Jann 1996-01-04
003 Ray 1996-01-08
004 Michael 1996-01-10
005 Jack 1996-01-13
006 Steven 1996-01-23
007 Lily 1996-01-25

在MyISAM引擎中的實(shí)現(xiàn)(二級(jí)索引也是這樣實(shí)現(xiàn)的)

終于有人將 MySQL 索引講清楚了

 

在InnoDB中的實(shí)現(xiàn)

[[269773]]

 

終于有人將 MySQL 索引講清楚了

 

04、問題

問:為什么索引結(jié)構(gòu)默認(rèn)使用B-Tree,而不是hash,二叉樹,紅黑樹?

hash:雖然可以快速定位,但是沒有順序,IO復(fù)雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查找效率跟數(shù)據(jù)有關(guān)(樹的高度),并且IO代價(jià)高。

紅黑樹:樹的高度隨著數(shù)據(jù)量增加而增加,IO代價(jià)高。

問:為什么官方建議使用自增長(zhǎng)主鍵作為索引。

結(jié)合B+Tree的特點(diǎn),自增主鍵是連續(xù)的,在插入過程中盡量減少頁分裂,即使要進(jìn)行頁分裂,也只會(huì)分裂很少一部分。

并且能減少數(shù)據(jù)的移動(dòng),每次插入都是插入到***??傊褪菧p少分裂和移動(dòng)的頻率。

插入連續(xù)的數(shù)據(jù):

終于有人將 MySQL 索引講清楚了

 

插入非連續(xù)的數(shù)據(jù)

終于有人將 MySQL 索引講清楚了 

 

責(zé)任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2020-07-29 09:21:34

Docker集群部署隔離環(huán)境

2021-07-05 22:22:24

協(xié)議MQTT

2024-04-01 10:09:23

AutowiredSpring容器

2020-12-24 15:18:27

大數(shù)據(jù)數(shù)據(jù)分析

2023-08-14 11:35:16

流程式轉(zhuǎn)化率數(shù)據(jù)指標(biāo)

2021-04-10 10:37:04

OSITCP互聯(lián)網(wǎng)

2020-10-16 17:20:21

索引MySQL數(shù)據(jù)庫

2021-01-29 10:50:04

數(shù)據(jù)中臺(tái)數(shù)據(jù)數(shù)據(jù)管理

2024-02-23 08:08:21

2022-01-05 09:27:24

讀擴(kuò)散寫擴(kuò)散feed

2020-04-23 10:21:57

Linux 網(wǎng)絡(luò)編程 數(shù)據(jù)

2019-05-22 08:43:45

指令集RISC-V開源

2024-02-27 14:27:16

2022-07-04 11:27:02

標(biāo)簽數(shù)據(jù)指標(biāo)標(biāo)簽體系

2021-04-21 10:00:08

MySQL索引數(shù)據(jù)庫

2023-05-29 13:59:00

GPTOpenAI監(jiān)督微調(diào)

2019-06-19 14:58:38

服務(wù)器負(fù)載均衡客戶端

2024-07-01 13:45:18

2021-02-25 08:21:38

高可用風(fēng)險(xiǎn)故障

2019-07-04 09:13:04

中臺(tái)百度團(tuán)隊(duì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)