真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么使用b樹(shù) mysql為什么采用b+樹(shù)

MySQL BTREE索引

個(gè)人能力有限,如有錯(cuò)誤請(qǐng)指出,共同學(xué)習(xí)。

創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比青白江網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式青白江網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋青白江地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。

二叉樹(shù)

B樹(shù)

B+樹(shù)

特點(diǎn):

聚簇索引

二級(jí)索引

key數(shù)據(jù)存儲(chǔ)量估算:

若每個(gè)頁(yè)可以存1000個(gè)key,而且樹(shù)的高度是4,那么

前提條件如下:

插入步驟

步驟一

因?yàn)樗饕羞€沒(méi)有數(shù)據(jù),所以此時(shí)的B+樹(shù)只有一個(gè)空的根結(jié)點(diǎn),又由于一個(gè)頁(yè)只能存3個(gè)key,首先將10,20,5插入進(jìn)去(實(shí)際上此步發(fā)生了3次插入),然后在頁(yè)面內(nèi)做數(shù)據(jù)排序,最終結(jié)果如下圖:

步驟二:

由于根頁(yè)面已經(jīng)寫(xiě)滿(mǎn),此時(shí)插入8,將發(fā)生分裂(根頁(yè)面分裂),大致步驟如下:

注意:在分裂過(guò)程中,根結(jié)點(diǎn)始終是不會(huì)變的,不管變成多大的樹(shù),根結(jié)點(diǎn)的頁(yè)面號(hào)始終如一。

步驟五:

插入數(shù)據(jù)40,發(fā)現(xiàn)比根結(jié)點(diǎn)23大,找到103號(hào)頁(yè)面,發(fā)現(xiàn)已滿(mǎn),執(zhí)行分裂,分裂同上面葉子結(jié)點(diǎn)的分裂步驟。分裂后如圖所示:

步驟六:

繼續(xù)插入下一個(gè)數(shù)據(jù)9,因?yàn)楸?0小,找到101號(hào)頁(yè)面,發(fā)現(xiàn)已滿(mǎn),需要做葉子結(jié)點(diǎn)分裂,如下圖:

傳統(tǒng)B+樹(shù)的數(shù)據(jù)刪除,一般都會(huì)有一個(gè)所謂的填充因子,來(lái)控制頁(yè)面數(shù)據(jù)的刪除比例,如果數(shù)據(jù)量小于這個(gè)填充因子所表示的數(shù)據(jù)量,就會(huì)有節(jié)點(diǎn)合并,這與分裂是相對(duì)應(yīng)的。

InnoDB的實(shí)現(xiàn)與傳統(tǒng)B+樹(shù)算法有不同之處,InnoDB在刪除索引數(shù)據(jù)時(shí),會(huì)先檢查當(dāng)前頁(yè)剩余的記錄數(shù),如果只剩下一條記錄,就會(huì)直接將這個(gè)頁(yè)面從B+樹(shù)中摘除,也只有這種情況,InnoDB才會(huì)回收一個(gè)頁(yè)面,InnoDB的頁(yè)面沒(méi)有合并一說(shuō),但是對(duì)于根節(jié)點(diǎn),即使索引數(shù)據(jù)全部刪除,根節(jié)點(diǎn)頁(yè)依然存在,只不過(guò)是以空頁(yè)的形式存在。

下面舉個(gè)例子描述索引刪除過(guò)程,前提條件與前面插入記錄時(shí)一致。

刪除數(shù)據(jù) 50

刪除過(guò)程全部結(jié)束,最終得到一個(gè)空的索引頁(yè)。

《MySQL運(yùn)維內(nèi)參》

B+樹(shù)動(dòng)畫(huà)演示:

聚集索引可以用b樹(shù)實(shí)現(xiàn)么

聚集索引可以用b樹(shù)實(shí)現(xiàn)。

簡(jiǎn)介:

B+樹(shù)中只有葉子節(jié)點(diǎn)會(huì)帶有指向記錄的指針,而B(niǎo)樹(shù)則所有節(jié)點(diǎn)都帶有。

B+樹(shù)索引可以分為聚集索引和非聚集索引。

mysql使用B+樹(shù),其中Myisam是非聚集索引,innoDB是聚集索引。

聚簇索引索引的葉節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn);而非聚簇索引的葉節(jié)點(diǎn)仍然是索引節(jié)點(diǎn),只不過(guò)有一個(gè)指針指向?qū)?yīng)的數(shù)據(jù)塊。

B+ 樹(shù)的特點(diǎn):

(1)所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點(diǎn)的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的。

(2)不可能在非葉子結(jié)點(diǎn)命中。

(3)非葉子結(jié)點(diǎn)相當(dāng)于是葉子結(jié)點(diǎn)的索引(稀疏索引),葉子結(jié)點(diǎn)相當(dāng)于是存儲(chǔ)(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層。

Mysql InnoDB b+樹(shù)的高度

為什么Mysql考慮使用B+樹(shù),而不是B樹(shù),其實(shí)我們可以先了解下B樹(shù)和B+樹(shù)的特點(diǎn)來(lái)看下。

※ 樹(shù)的每個(gè)結(jié)點(diǎn)都會(huì)存儲(chǔ)數(shù)據(jù)

※ 單次查詢(xún)不一定要遍歷到樹(shù)的根部,平均查詢(xún)時(shí)間會(huì)比較快

※ 非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只存儲(chǔ)(冗余)索引,索引包含主鍵和指針

※ 葉子節(jié)點(diǎn)才真正存儲(chǔ)數(shù)據(jù)

※ 每個(gè)葉子節(jié)點(diǎn)互相鏈表相連,保證了范圍查詢(xún)的時(shí)效性(頁(yè)之間用雙向鏈表連接,數(shù)據(jù)間用單項(xiàng)鏈表鏈接)

InnoDB最小存儲(chǔ)單位是頁(yè),葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)最小單位都是頁(yè),頁(yè)大小Mysql 默認(rèn)設(shè)定16384字節(jié),約為16KB。

我們假設(shè)主鍵ID為bigint類(lèi)型,長(zhǎng)度為8字節(jié),而指針大小在InnoDB源碼中設(shè)置為6字節(jié),這樣一共14字節(jié)

我們一個(gè)頁(yè)中能存放多少這樣的索引元素,其實(shí)就代表有多少指針,即16384/14=1170;

高度為2的B+樹(shù)能存放1170×16=18720

高度為3的B+樹(shù)能存放1170×1170×16 = 21902400

InnoDB中B+樹(shù)高度一般為1-3層,它就能滿(mǎn)足千萬(wàn)級(jí)的數(shù)據(jù)存儲(chǔ)。

在查找數(shù)據(jù)時(shí)一次頁(yè)的查找代表一次IO,所以通過(guò)主鍵索引查詢(xún)通常只需要1-3次IO操作即可查找到數(shù)據(jù)。

Mysql InnoDB索引原理

理解Mysql索引的原理和數(shù)據(jù)結(jié)構(gòu)有助于我們更好的使用索引以及進(jìn)行SQL優(yōu)化,索引是在存儲(chǔ)引擎層面實(shí)現(xiàn)的,所以不同的引擎實(shí)現(xiàn)的索引也有一定的區(qū)別,但是在生產(chǎn)環(huán)境中,我們最常用的就是InnoDB引擎和B樹(shù)索引,OK,那本文要討論的重點(diǎn)也同樣是 InnoDB引擎下的B樹(shù)索引 。

我們建立一個(gè)表來(lái)進(jìn)行測(cè)試,表的DDL如下所示,我們要關(guān)注的是表t_book上的主鍵索引id和name author publish_date三列組成的索引test_index。

Mysql中的B樹(shù)索引是使用B+樹(shù)實(shí)現(xiàn)的,關(guān)于B+樹(shù)的數(shù)據(jù)結(jié)構(gòu)個(gè)人認(rèn)為美團(tuán)點(diǎn)評(píng)技術(shù)博客中Mysql索引原理及慢查詢(xún)優(yōu)化一文中介紹的非常詳實(shí),B+樹(shù)的數(shù)據(jù)結(jié)構(gòu)如下圖所示。

圖中淺藍(lán)色塊即磁盤(pán)塊,根節(jié)點(diǎn)磁盤(pán)塊中存儲(chǔ)17和35兩個(gè)數(shù)據(jù),其中指針P1指向小于17的數(shù)據(jù),指針P2指向大于17小于35的數(shù)據(jù),指針P3指向大于35的數(shù)據(jù)。顯然通過(guò)B+樹(shù)索引查詢(xún)數(shù)據(jù)與B+樹(shù)的高度有關(guān),如上圖的B+樹(shù)索引查找一個(gè)葉子節(jié)點(diǎn)的數(shù)據(jù)只需要三次磁盤(pán)IO,對(duì)于Mysql來(lái)說(shuō)三層的B+樹(shù)可以索引上百萬(wàn)的數(shù)據(jù),這對(duì)于查詢(xún)效率的提升是巨大的。

總結(jié)起來(lái)Mysql中B樹(shù)索引有以下關(guān)鍵特點(diǎn):

Mysql中的B樹(shù)索引有兩種數(shù)據(jù)存儲(chǔ)形式,一種為聚簇索引,一種為二級(jí)索引。

InnoDB一般會(huì)使用表的主鍵來(lái)作為聚簇索引,如果一個(gè)表沒(méi)有主鍵(不建議這么玩)InnoDB會(huì)選用一個(gè)唯一非空索引來(lái)代替,如果沒(méi)有這樣的索引,InnoDB會(huì)隱式建立一個(gè)聚簇索引。聚簇的含義即是數(shù)據(jù)行和相鄰的鍵值緊湊的存儲(chǔ)在一起,占據(jù)一塊連續(xù)的磁盤(pán)空間,因此通過(guò)聚簇索引訪問(wèn)數(shù)據(jù)可以有效減少隨機(jī)IO,通常使用聚簇索引查找比非聚簇索引查找速度更快。以我們建立的表t_book為例,聚簇索引即為自增主鍵id,其B樹(shù)索引數(shù)據(jù)結(jié)構(gòu)可以用下圖來(lái)表示。

聚簇索引有以下關(guān)鍵特點(diǎn):

InnoDB的B樹(shù)索引中除了聚簇索引,就都是二級(jí)索引了,二級(jí)索引的含義是索引的葉子節(jié)點(diǎn)除了存儲(chǔ)了索引值,還存儲(chǔ)了主鍵id,在使用二級(jí)索引進(jìn)行查詢(xún)時(shí),查找到二級(jí)索引B樹(shù)上的葉子節(jié)點(diǎn)后還需要去聚簇索引上去查詢(xún)真實(shí)數(shù)據(jù),但是這里有一種特殊情況,即查詢(xún)所需的所有字段在二級(jí)索引中都可以獲取,此時(shí)就不需要再去回表查數(shù)據(jù)了,這種情況就是索引覆蓋(EXPLAIN中EXTRA列中會(huì)出現(xiàn)USING INDEX,本文只關(guān)注索引結(jié)構(gòu),不詳細(xì)討論索引覆蓋等技術(shù)的使用,如果深入理解索引的數(shù)據(jù)結(jié)構(gòu),索引覆蓋等技術(shù)也沒(méi)有那么神秘)。

在我們的測(cè)試表t_book中,test_index即為二級(jí)索引,由于我們把除了主鍵id所有的列都作為一個(gè)聯(lián)合索引,所以在這個(gè)表上的查詢(xún)都可以使用索引覆蓋技術(shù),但是具體生產(chǎn)環(huán)境中也不建議總是采用這種做法,索引列的增加也會(huì)增大插入更新數(shù)據(jù)時(shí)的索引更新成本,具體的優(yōu)化要視具體情況決策。t_book上的二級(jí)索引test_index的索引結(jié)構(gòu)由下圖表示。

通過(guò)以上結(jié)構(gòu),我們可以推斷出二級(jí)索引的以下關(guān)鍵特點(diǎn):

索引覆蓋:

最左前綴匹配:

二級(jí)索引可以說(shuō)是我們?cè)贛ysql中最常用的索引,通過(guò)理解二級(jí)索引的索引結(jié)構(gòu)可以更容易理解二級(jí)索引的特性和使用。

最后聊點(diǎn)輕松的索引結(jié)構(gòu),哈希索引就是通過(guò)哈希表實(shí)現(xiàn)的索引,即通過(guò)被索引的列計(jì)算出哈希值,并指向被索引的記錄。

哈希索引有如下特性:

Mysql索引原理及慢查詢(xún)優(yōu)化

高性能Mysql 第三版

MYSQL使用基礎(chǔ)、進(jìn)階分享

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB公司開(kāi)發(fā),屬于Oracle旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。

端口是3306。

表很多時(shí),使用linux腳本,需要根據(jù)需要修改一下:

和創(chuàng)建一樣,可以加上 if exists

可兩篇文章:

如:

用于在已有的表中添加、刪除或修改列。

添加 ADD

默認(rèn)是添加到最后,但可以指定位置。 FIRST :添加最前

AFTER 字段名 :添加指定字段之后

例子:

刪除 DROP

修改 MODIFY 主要修改原列的類(lèi)型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。

修改字段名 CHANGE

可以把表2的數(shù)據(jù)復(fù)制到表1中,但 不能復(fù)制約束性條件 。

單行

多行,注意 只有一個(gè)VALUES :

不寫(xiě) (行1, 行2...) 這一部分的話(huà),默認(rèn)一一對(duì)應(yīng)

除了以上方法外,還可以用SET為每一行附上相應(yīng)的值。

假如沒(méi)有篩選的話(huà),就給全部都修改了。可以用 WHERE 篩選。

假如 沒(méi)有篩選的話(huà),就給全部刪除了 。相當(dāng)于清空。

清空

先把表刪除,然后再建一個(gè)。與 DELETE FROM 相比, TRUNCATE 的效率更快,因?yàn)? DELETE FROM 是把記錄逐條刪除的。

查詢(xún)執(zhí)行的順序

FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT

注意

當(dāng)數(shù)據(jù)很大,上百萬(wàn)的時(shí)候,使用LIMIT ... OFFSET ..的方式進(jìn)行分頁(yè)十分浪費(fèi)資源且耗時(shí)長(zhǎng)。最好是結(jié)合WHERE使用,如:

REGEXP 使用正則表達(dá)進(jìn)行匹配。 查詢(xún)時(shí),需要搭配WHERE或HAVING使用 。

兩個(gè)表之間有交集且要用到兩個(gè)表的數(shù)據(jù)時(shí),可以使用內(nèi)連接查詢(xún)。

LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒(méi)有匹配。如果右表中沒(méi)有匹配,則結(jié)果為 NULL。

用法:

RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒(méi)有匹配。如果左表中沒(méi)有匹配,則結(jié)果為 NULL。 把LEFT JOIN的表1、表2調(diào)換順序,就是REGHT JOIN 。

FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個(gè)表中存在匹配,則返回行. 相當(dāng)于結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。

但 MySQL中不支持 FULL OUTER JOIN 。

即SELECT嵌套。

IN 一個(gè)查詢(xún)結(jié)果作為另一個(gè)查詢(xún)的條件。 如:

EXISTS 用于判斷查詢(xún)子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時(shí)執(zhí)行。 如:

索引的本質(zhì)是一種排好序的數(shù)據(jù)結(jié)構(gòu)。利用索引可以提高查詢(xún)速度。

常見(jiàn)的索引有:

MySQL通過(guò)外鍵約束來(lái)保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性。 外鍵的使用條件:

外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作。

對(duì)已有的兩個(gè)表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b

為子表添加一個(gè)字段,當(dāng)做外鍵

為子表添加外鍵約束條件

假如刪除記錄報(bào)錯(cuò): [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)

這是因?yàn)镸ySQL中設(shè)置了foreign key關(guān)聯(lián),造成無(wú)法更新或刪除數(shù)據(jù)??梢酝ㄟ^(guò)設(shè)置 FOREIGN_KEY_CHECKS 變量來(lái)避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:?jiǎn)?dòng)外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當(dāng)前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;

使用 UNION 來(lái)組合兩個(gè)查詢(xún),如果第一個(gè)查詢(xún)返回 M 行,第二個(gè)查詢(xún)返回 N 行,那么組合查詢(xún)的結(jié)果一般為 M+N 行。

每個(gè)查詢(xún)必須包含相同的列、表達(dá)式和聚集函數(shù)。

默認(rèn)會(huì)去除相同行,如果需要 保留 相同行,使用 UNION ALL 。

只能包含一個(gè) ORDER BY 子句,并且必須位于語(yǔ)句的最后 。

內(nèi)置函數(shù)很多, 見(jiàn): MySQL 函數(shù)

我們一般使用 START TRANSACTION 或 BEGIN 開(kāi)啟事務(wù), COMMIT 提交事務(wù)中的命令, SAVEPOINT : 相當(dāng)于設(shè)置一個(gè)還原點(diǎn), ROLLBACK TO : 回滾到某個(gè)還原點(diǎn)下

一般的使用格式如下:

開(kāi)啟事務(wù)時(shí), 默認(rèn)加鎖

根據(jù)類(lèi)型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫(xiě)鎖(WRITE LOCK)。

根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫(kù)服務(wù)器實(shí)現(xiàn),行鎖由存儲(chǔ)引擎實(shí)現(xiàn)。

除此之外,我們可以顯示加鎖

加鎖時(shí), 如果沒(méi)有索引,會(huì)鎖表,如果加了索引,就會(huì)鎖行

InnoDB默認(rèn)支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競(jìng)爭(zhēng)的時(shí)候就會(huì)出現(xiàn)死鎖的情況

解決方法:

即ACID特性:

由于并發(fā)事務(wù)會(huì)引發(fā)上面這些問(wèn)題, 我們可以設(shè)置事務(wù)的隔離級(jí)別解決上面的問(wèn)題.

MySQL的默認(rèn)隔離級(jí)別(可重復(fù)讀)

查看當(dāng)前會(huì)話(huà)隔離級(jí)別

方式1

方式2

設(shè)置隔離級(jí)別

主從集群的示意圖如下:

主要涉及三個(gè)線程: binlog 線程、 I/O 線程和 SQL 線程。

同步流程:

由于MySQL主從集群只會(huì)從主節(jié)點(diǎn)同步到從節(jié)點(diǎn), 不會(huì)反過(guò)來(lái)同步, 所以需要讀寫(xiě)分離

讀寫(xiě)分離需要在業(yè)務(wù)層面實(shí)現(xiàn) , 寫(xiě)數(shù)據(jù)只能在主節(jié)點(diǎn)上完成, 而讀數(shù)據(jù)可以在主節(jié)點(diǎn)或從節(jié)點(diǎn)上完成

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

MySQL的索引有

推薦兩個(gè)在線工具:

簡(jiǎn)單來(lái)說(shuō), B樹(shù)是在紅黑樹(shù)(一個(gè)平衡二叉樹(shù))的基礎(chǔ)上將一個(gè)節(jié)點(diǎn)存放多個(gè)值, 實(shí)現(xiàn)的, 降低了樹(shù)的高度, 每個(gè)節(jié)點(diǎn)都存放索引及對(duì)應(yīng)數(shù)據(jù)指針, 同一層的節(jié)點(diǎn)是遞增的

而B(niǎo)+樹(shù)在B樹(shù)的基礎(chǔ)上進(jìn)行優(yōu)化, 非葉子節(jié)點(diǎn)存放 子節(jié)點(diǎn)的開(kāi)始的索引, 葉子節(jié)點(diǎn)存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點(diǎn)之間有雙向的指針

如下示意圖:

不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見(jiàn)的 MyISAM 和 InnoDB

MyISAM 的B+樹(shù)葉子節(jié)點(diǎn)存放表數(shù)據(jù)的指針, InnoDB 的B+樹(shù)葉子節(jié)點(diǎn)存放處主鍵外的數(shù)據(jù)

其他的:

即多個(gè)列組成一個(gè)索引, 語(yǔ)法:

由于聯(lián)合索引的B+樹(shù)的結(jié)構(gòu), 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會(huì)全表掃描

如果你對(duì)列進(jìn)行了 (+,-,*,/,!) , 那么都將不會(huì)走索引。

OR 引起的索引失效

OR 導(dǎo)致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個(gè)字段,那么索引 不會(huì)失效 , 反之索引失效 。

這個(gè)我相信大家都明白,模糊搜索如果你前綴也進(jìn)行模糊搜索,那么不會(huì)走索引。

這兩種用法,也將使索引失效。另 IN 會(huì)走索引,但是當(dāng)IN的取值范圍較大時(shí)會(huì)導(dǎo)致索引失效,走全表掃描, 見(jiàn): MySQL中使用IN會(huì)不會(huì)走索引

不走索引。

走索引。

所以設(shè)計(jì)表的時(shí)候, 建議不可為空, 而是將默認(rèn)值設(shè)置為 "" ( NOT NULL DEFAULT "" )

MySQL索引

MySQL的Innodb存儲(chǔ)引擎的索引分為聚集索引和非聚集索引兩大類(lèi)

特點(diǎn):B+樹(shù)葉子節(jié)點(diǎn)存儲(chǔ)行數(shù)據(jù)

一個(gè)表中,必須有一個(gè)聚集索引,只能有一個(gè)聚集索引,Innodb通常把一個(gè)表的主鍵索引作為聚集索引,如果沒(méi)有主鍵InnoDB會(huì)選擇一個(gè)唯一索引代替。如果沒(méi)有這樣的索引,InnoDB會(huì)隱式的定義一個(gè)主鍵來(lái)作為聚集索引,這個(gè)字段為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。

利用主鍵索引查找行數(shù)據(jù)是最快的,建議使用自增主鍵原因是利于索引樹(shù)的構(gòu)建(主鍵自增寫(xiě)入時(shí)新插入的數(shù)據(jù)不會(huì)影響到原有頁(yè),插入效率高;但是如果主鍵是無(wú)序的或者隨機(jī)的,那每次的插入可能會(huì)導(dǎo)致原有頁(yè)頻繁的分裂,影響插入效率)

特點(diǎn):B+樹(shù)葉子節(jié)點(diǎn)存儲(chǔ)主鍵ID

一個(gè)表中可以有多個(gè)非聚集索引,每個(gè)非聚集索引即是一棵B+樹(shù)

通過(guò)非聚集索引查找數(shù)據(jù)時(shí),需要先在非聚集索引上找到主鍵ID,再?gòu)木奂饕@取行數(shù)據(jù),這個(gè)過(guò)程就稱(chēng)之為回表

B樹(shù)索引中的B樹(shù)實(shí)際上是B+樹(shù),至于為什么使用B+樹(shù)而不使用B樹(shù)或者紅黑樹(shù)的原因在另外的文章中有提及。

特點(diǎn):

特點(diǎn):類(lèi)似JDK中的HashMap,但無(wú)法支持范圍查詢(xún)

特點(diǎn):使用的算法仍然是B樹(shù)索引,不同的就是索引列的值必須唯一

對(duì)于普通索引來(lái)說(shuō),查找到滿(mǎn)足條件的第一個(gè)記錄后,需要查找下一個(gè)記錄,直到碰到第一個(gè)不滿(mǎn)足條件的記錄。

對(duì)于唯一索引來(lái)說(shuō),由于索引定義了唯一性,查找到第一個(gè)滿(mǎn)足條件的記錄后,就會(huì)停止繼續(xù)檢索,提升索引性能

另外插入行時(shí)會(huì)構(gòu)建該唯一索引,假如索引值重復(fù)將插入失敗,適合業(yè)務(wù)上做唯一性檢驗(yàn)

通過(guò)建立倒排索引,可以極大的提升檢索效率,解決判斷字段是否包含的問(wèn)題,但是業(yè)務(wù)上一般都不采用這種索引,而是使用ES處理全文搜索需求

僅對(duì)某個(gè)特定字段建立的索引,如(biz_id)

對(duì)多個(gè)字段建立的索引,如(biz_id,type)


新聞名稱(chēng):mysql怎么使用b樹(shù) mysql為什么采用b+樹(shù)
文章URL:http://weahome.cn/article/hhipdg.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部