資料庫索引

2021-10-08 04:11:12 字數 3685 閱讀 4728

索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。

索引是一種資料結構。資料庫索引是對資料庫表中的乙個或者多個列的值進行排序的結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用b樹及其變種b+樹。

更通俗的說,索引就相當於目錄。為了方便查詢書中的內容,通過對內容建立索引形成目錄。索引是乙個檔案,要佔據物理空間。

聚集索引:將資料行和相鄰的索引鍵值緊湊的儲存在一起,所以乙個表只能有乙個聚簇索引,因為不可能將資料存放在兩個位置

可以通過create clustered index index_name on table_name (column_name)建立聚集索引

非聚集索引:除聚簇索引外的其他索引都是非聚簇索引。

主鍵索引:資料列不允許重複,不允許為null,乙個表只能有乙個主鍵。

唯一索引:資料列不允許重複,允許為null值,乙個表允許多個列建立唯一索引。

可以通過alter table table_name add unique (column)建立唯一索引

可以通過alter table table_name add unique (column1,column2)建立唯一組合索引

普通索引:基本的索引型別,沒有唯一性的限制,允許為null值。

可以通過alter table table_name add index index_name (column)建立普通索引

可以通過alter table table_name add index index_name(column1, column2, column3)建立組合索引

全文索引:是目前搜尋引擎使用的一種關鍵技術。

可以通過alter table table_name add fulltext (column)建立全文索引

索引就是用來快速查詢那些具有特定值的記錄的,索引的原理就是將無序的資料變成有序的查詢

把建立了索引的列內容進行排序

對排序結果生成倒排表

在倒排表內容上拼上資料位址鏈

在查詢的時候,先拿到倒排表內容,再取出資料位址鏈,從而拿到具體資料

較頻繁作為查詢條件的字段才去建立索引

更新頻繁欄位不適合建立索引

不能有效區分資料的列不適合做索引列(如性別,男女未知,最多也就三種,區分度太低)

定義有外來鍵的資料列一定要建立索引。

對於查詢中很少涉及的列,重複值比較多的列不要建立索引。

建立表時建立索引

create

table

user

( id int

auto_increment

primary

key,

first_name varchar(16

),last_name varchar(16

),id_card varchar(18

),information text

,key name (first_name, last_name)

, fulltext key

(information)

,unique

key(id_card)

)

使用alter table命令去增加索引

alter table table_name add index index_name (column_list);

使用create index命令建立

create index index_name on table_name (column_list);

根據索引名刪除普通索引、唯一索引、全文索引:alter table 表名 drop key 索引名

使用drop index 表名.索引名[,...n]命令刪除索引

hash索引,b+樹索引,b樹索引

b-tree 索引:

b-tree 是一種平衡的多叉排序樹,,,b-tree的特點:(m代表著階數,代表著乙個節點最多有多少個孩子節點

定義任意非葉子結點最多只有m個兒子;且m>2;

根結點的兒子數為[2, m];

除根結點以外的非葉子結點的兒子數為[m/2, m];

每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)

非葉子節點的關鍵字個數 = 指向兒子的指標個數 - 1;

非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;

所有的葉子節點位於同一層

b-tree的特性:

關鍵字集合分布在整棵樹中,

任何關鍵字出現且只出現在乙個節點中

搜尋有可能在非葉子節點中結束

搜尋效能等價於做二分查詢,做一次查詢最大的次數為 h 次,h為b-tree的深度。

在資料庫中b-tree索引的實現:

根節點常駐記憶體

根節點和非葉子節點的槽中存放了指向下乙個子節點的指標,每個頁中存放著一些關鍵字,與指標相對應,定義了子節點中值的上限與下限,儲存引擎根據這些指標向下層查詢, 但是葉子節點中只存放資料的實體地址,不再存放指標。

將每乙個節點設定為乙個頁的大小,這樣只需要一次i/o就可以讀取乙個節點的內容,(這是因為頁是計算機管理儲存器的邏輯塊,硬體和作業系統在進行記憶體和磁碟上的資料交換時往往以乙個頁作為基本單位)

在葉節點和非葉子節點中,都儲存了關鍵字(該關鍵字裡包含了指向該索引資料本身的實體地址),在一次查詢中,給定了某個關鍵字,如果在任何節點找到了該關鍵字(包括非葉結點)則就可以根據找到的關鍵字讀取到該關鍵字所指向的實際資料。

b+tree 索引: 是b-tree的變種

大部分的定義和b-tree相同,但是它有獨特於b-tree的地方,

非葉結點的子樹指標和關鍵字個數相同

非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間)

所有的葉子節點增加了乙個指標,指標指向相鄰的葉子節點。

所有的關鍵字都在葉子節點**現

b+tree的特點:

所有的關鍵字都出現在葉子節點中(稠密索引),而且葉子節點中的關鍵字恰好都是有序的

不可能在非葉子節點查詢成功,這是因為非葉子節點中儲存的仍舊是索引,並沒有儲存實際的資料或者指向實際資料的實體地址,在葉子節點才存放的是實際的資料或者實際資料的實體地址。

查詢方式有兩種: 一種是從根節點進行查詢,另一種是可以從葉子節點的開頭開始查詢,因為葉子節點中儲存了指向下乙個葉子節點的指標,而且在資料庫的實現中,葉子節點在實際的物理儲存中是順序存放的,也就是葉子節點都是集中在一塊儲存區域內存放的(這樣的好處是大大提高了區間查詢效率)。

更適合檔案系統

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...