mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明
本文出處:http://www.cnblogs.com/wy123/p/7211742.html
(保留出處并非什么原創(chuàng)作品權(quán)利,本人拙作還遠(yuǎn)遠(yuǎn)達(dá)不到,僅僅是為了鏈接到原文,因?yàn)楹罄m(xù)對(duì)可能存在的一些錯(cuò)誤進(jìn)行修正或補(bǔ)充,無他)
MySQL中的InnoDB引擎表索引類型有一下幾種(以下所說的索引,沒有特殊說明,均指InnoDB引擎表索引。)
0 = Secondary Index,二級(jí)索引,
1 = Clustered Index,聚集索引
2 = Unique Index,唯一索引
3 = Primary Index,主鍵索引
32 = Full-text Index,全文索引
64 = Spatial Index,空間索引
128 = A secondary index that includes a virtual generated column.二級(jí)計(jì)算列索引。
其中二級(jí)索引,聚集索引,唯一索引,主鍵索引,二級(jí)計(jì)算列索引,按照邏輯存儲(chǔ)結(jié)構(gòu)來看,都是B+樹來存儲(chǔ)的
這一點(diǎn)與其他數(shù)據(jù)庫的B+樹索引邏輯存儲(chǔ)結(jié)構(gòu)上看,并沒有太大的不同,以上幾種索引都是從邏輯角度來劃分的。
如果從物理存儲(chǔ)角度來看,MySQL中的這幾類索引可以劃分為聚集索引和二級(jí)索引(或者叫非聚集索引)
其中,主鍵索引和聚集索引,可以歸類為聚集索引,二級(jí)索引,唯一索引,二級(jí)計(jì)算列索引都數(shù)據(jù)非聚集索引。
MySQL中的聚集索引
MySQL聚集索引就是根據(jù)主鍵,把整張表的數(shù)據(jù),在邏輯上組織成一棵B+樹,因此一個(gè)表只能由一個(gè)聚集索引。
非葉子節(jié)點(diǎn)存儲(chǔ)聚集索引key值,葉子節(jié)點(diǎn)存儲(chǔ)表中的數(shù)據(jù)本身,葉子節(jié)點(diǎn)與葉子節(jié)點(diǎn)之間采用雙向鏈表的方式連接在一起。
了解MySQL的聚集索引之前,先了解一下MySQL主鍵生成機(jī)制。
MySQL的InnoDB必須有一個(gè)主鍵,
如果在建表的時(shí)候指定了主鍵,那么這個(gè)主鍵就是該表的主鍵(聽起來這么別扭,主要是跟未指定主鍵的情況下,自動(dòng)生成的額主鍵作對(duì)比)
如果在建表的時(shí)候沒有指定主鍵,那么存儲(chǔ)引擎會(huì)自動(dòng)為表上建一個(gè)主鍵列
1)對(duì)于指定了主鍵的表,主鍵生成的索引就是“主鍵索引”,
2)對(duì)于未指定主鍵的表,如果有(一個(gè)或者多個(gè))非空的唯一索引,(第一個(gè))非空唯一約束做主鍵
3)對(duì)于未指定主鍵的表,且沒有唯一約束的表,默認(rèn)生成一個(gè)主鍵,該主鍵上生成的索引就是“聚集索引”,
實(shí)際上,前者的“主鍵索引”和后者的“聚集索引”,物理存儲(chǔ)上都可以歸屬為聚集索引
1,顯式主鍵索引(聚集索引)
如下截圖,創(chuàng)建了test_index_type_1
在建表的時(shí)候指定了主鍵,則主鍵默認(rèn)生成主鍵索引,索引類型是3(從物理存儲(chǔ)角度看,是聚集索引)
在表創(chuàng)建完成之后創(chuàng)建了索引,生成的是二級(jí)索引,索引類型是0(從物理存儲(chǔ)角度看,是非聚集索引)
2,非空唯一約束生成的主鍵索引(聚集索引)
如下截圖,創(chuàng)建了test_index_type_2,
在建表的時(shí)候沒有指定了主鍵,但是指定了一個(gè)唯一的非空約束,那么這個(gè)字段會(huì)當(dāng)做主鍵用,生成的索引類型是3(從物理存儲(chǔ)角度看,是聚集索引)
3,系統(tǒng)默認(rèn)主鍵生成的聚集索引(聚集索引)
如下截圖,創(chuàng)建了test_index_type_3表,
在建表的時(shí)候沒有指定了主鍵,也沒有指定唯一的非空約束,InnoDB引擎會(huì)自動(dòng)生成一個(gè)6字節(jié)的指針,生成的索引類型是聚集索引,類型是1(從物理存儲(chǔ)角度看,是聚集索引)
非聚集索引
非聚集索引,非聚集索引同樣是B+樹的結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù)的,
與聚集索引做大的差異在于非聚集索的葉子節(jié)點(diǎn)存儲(chǔ)的僅僅是索引的key值+聚集索引的key值,但是不包括所有的非索引鍵值。
1,唯一索引約束生成的唯一索引(非聚集索引)
如下截圖,創(chuàng)建了test_index_type_4表,
指定了id為unique的,那么會(huì)自動(dòng)在id列上創(chuàng)建一個(gè)唯一索引。
2,手動(dòng)創(chuàng)建的唯一索引(非聚集索引)
如下截圖,創(chuàng)建了test_index_type5表,
手動(dòng)在創(chuàng)建一個(gè)唯一的索引,那么這個(gè)索引類型為唯一索引
3,手動(dòng)創(chuàng)建的二級(jí)索引(非聚集索引)
如下截圖,創(chuàng)建了test_index_type6表,
那手動(dòng)在創(chuàng)建一個(gè)的索引(未指定unique),那么這個(gè)索引類型為二級(jí)索引
4,計(jì)算列索引,在計(jì)算列上手動(dòng)創(chuàng)建索引(非聚集索引)
如下截圖,創(chuàng)建了test_index_type7表,
test_index_type7上有一個(gè)計(jì)算列,創(chuàng)建完成之后在計(jì)算列上加索引,索引為計(jì)算列索引
總結(jié):
整體上來看,MySQL的幾種類型的B+樹的索引還是比較容易理解的,跟SQL Server中的索引也比較類似。
MySQL的InnoDB引擎表中,主鍵索引,非空唯一約束生成的聚集索引,聚集索引,從物理存儲(chǔ)上看都數(shù)據(jù)聚集索引。
主鍵索引,非空唯一約束生成的聚集索引,聚集索引,三者有一個(gè)明顯的特點(diǎn),都要求所在的列是非空且唯一的。
另外就是MySQL無法顯式創(chuàng)建聚集索引,也即create clustered index.
這一點(diǎn)與SQL Server有很大的不同,
1,在SQL Server中,如果沒有指定主鍵,或者指定了主鍵沒有但是指定為nonclustered,那么表就是為堆表,系統(tǒng)不會(huì)添加默認(rèn)字段作為聚集索引
2,SQL Server的主鍵可以僅僅是主鍵,可以不是聚集索引(默認(rèn)情況下主鍵是聚集索引)。
聚集索引可以指定在任意一個(gè)列上,可以是非主鍵列,可以是非唯一,可為null,可重復(fù)的列,比如如下
內(nèi)容來源于網(wǎng)絡(luò)如有侵權(quán)請(qǐng)私信刪除
總結(jié)
以上是生活随笔為你收集整理的mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lamp mysql大小限制_[转]LA
- 下一篇: mysql核心数据库_从MySQL基础进