資料庫索引

2022-08-18 19:09:10 字數 4400 閱讀 4641

一、索引簡介

1.索引是什麼?

mysql官對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。即得到索引的本質:索引是資料結構。

1)你可以理解為「排好序的快速查詢資料結構」。

詳解(重要):

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。下圖就是一種可能的索引方式示例:

左邊是資料表,一共有兩列七條記錄,最左邊的是資料儲存的實體地址。

為了加快 col2 的查詢,可以維護乙個右邊所示的二叉查詢樹,每個節點分別包含索引鍵值和乙個指向對應資料記錄位址的指標,這樣就可以運用二叉查詢樹在一定的複雜度內獲取到相應資料,從而快速的檢索出符合條件的記錄。

我們平時所說的索引,如果沒有特別指明,都是指 b 樹(多路搜尋樹,並不一定是二叉樹)結構組織的索引。其中聚集索引,次要索引,覆蓋索引,復合索引,字首索引,唯一索引預設都是使用 b+樹索引,統稱索引。當然,除了b+樹這種型別的索引之外,還有雜湊索引(hash index)等。

2.索引的優勢和劣勢

優勢:劣勢:

3.mysql的索引分類

1)單值索引

即乙個索引值包含單個列,乙個表可以有多個單列索引

建立方法:

a. 建表的時候一起建立

create table mytable (name varchar(32) , index index_mytable_name (name));

b. 建表後,直接建立索引

create index index_mytable_name on mytable(name);

c. 修改表結構

alter table mytable add index index_mytable_name (name);

注:如果是字串字段,還可以指定索引的長度,在列命令後面加上索引長度就可以了(例如:name(11))

2)唯一索引

索引列的值必須是唯一的,但允許有空值。(銀行卡號)

建立方法:

a. 建表的時候一起建立

create table mytable (`name` varchar(32) , unique index_unique_mytable_name              (`name`));

b. 建表後,直接建立索引

create unique index index_mytable_name on mytable(name);

c. 修改表結構

alter table mytable add unique index index_mytable_name (name);

注:如果是字串字段,還可以指定索引的長度,在列命令後面加上索引長度就可以了(例如:name(11))

3)復合索引

即乙個索引包含多個列。

建立方法:

a. 建表的時候一起建立

create table mytable (`id` int(11) ,`name` varchar(32) , index index_mytable_id_name            (`id`,`name`));

b. 建表後,直接建立索引

create index index_mytable_id_name on mytable(id,name);

c. 修改表結構

alter table mytable add index index_mytable_id_name (id,name);

4)主鍵索引

是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引。

建立方法:

a. 建表的時候一起建立

create table mytable (`id` int(11) not null auto_increment ,`name` varchar(32)   , primary key (`id`));

b. 修改表結構

alter table test.t1 add constraint t1_pk primary key (id);

注:如果是字串字段,還可以指定索引的長度,在列命令後面加上索引長度就可以了(例如:name(11))

5)全文索引

主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。

fulltext索引跟其它索引大不相同,它更像是乙個搜尋引擎,而不是簡單的where語句的引數匹配。

fulltext索引配合match against操作使用,而不是一般的where語句加like。

它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。

建立方法:

a. 建表的時候一起建立

create table `article` (`id` int(11) not null auto_increment ,`title` char(250) not null   ,`contents` text null ,`create_at` int(10) null default null ,primary key (`id`),fulltext   (contents));

b. 建表後,直接建立索引

create fulltext index index_article_contents on article(contents);

c. 修改表結構

alter table article add fulltext index index_article_contents (contents);

6)基本語法

建立:① create [unique] index indexname on mytable(columnname(length));

② alert mytable add [unique] index [indexname] on (columnname(length));

刪除:drop index [indexname] on mytable;

檢視:show index from table_name\g

4.mysql索引結構

1)b+ 樹

【初始化介紹】

一顆 b+ 樹,淺藍的的快我們成為磁碟塊,可以看到每個磁碟塊包含幾個資料項(深藍色所示)和指標(黃色所示),如磁碟塊1包含資料項17和35,包含指標p1,p2,p3。

p1表示洗浴17的磁碟塊,p2表示在17和35之間的磁碟塊,p3表示大於35的磁碟塊。

真實的資料存在於葉子節點即3、5、9、10、13、15、28、29、36、60、75、79、90、99。

非葉子節點不儲存真實的資料,只儲存指引搜尋方向的資料項,如17、35並不真實存在於資料表中。

【查詢過程】

如果要查詢資料項29,那麼首先會把磁碟塊1由磁碟載入到記憶體,此時發生一次i口, 在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的p2指標,記憶體時間因為非常短(相比磁碟的i0)可以忽略不計,通過磁碟塊1的p2指標的磁碟位址把磁碟塊3由磁碟載入到記憶體,發生第二次i0,29在26和30之間,鎖定磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體,發生第三次i0,同時記憶體中做二分查詢找到29,結束查詢,總計三次i0。

真實的情況是,3層的b+樹可以表示上百萬的資料,如果上百萬的資料查詢只需要三次i0,效能提高將是巨大的,如果沒有索引,每個資料項都要發生一次i0,那麼總共需要百萬次的i0,顯然成本非常非常高。

5.哪些情況需要建立索引?

1)主鍵自動建立唯一索引。

2)頻繁作為查詢條件的字段應該建立索引。

3)查詢中與其他表關聯的字段,外來鍵關係建立索引。

4)單鍵/組合索引的選擇問題?(在高併發下傾向建立組合索引)。

5)查詢中排序的字段,排序欄位若通過索引去訪問將大大提高排序速度。

6)查詢中統計或者分組字段。

6.哪些情況不需要建立索引?

1)表記錄太少

2)經常增刪改的表,why:提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert、update、delete,因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案。

3)where 條件裡用不到的字段不建立索引。

4)資料重複且分布均勻的表字段,因此應該只為最經常查詢和最經常排序的資料列建立索引。注意,如果某個資料列包含許多重複的內容,為它建立索引就沒有太大的實際效果。

資料庫 資料庫索引

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

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

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

資料庫索引

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