資料庫索引本質上是一種資料結構(儲存結構+演算法),目的是為了加快資料檢索速度。
1、索引的型別(待完善)
主鍵索引:給表設定主鍵,這個表就擁有主鍵索引。
唯一索引:unique
普通索引:增加某個欄位的索引,比如使用者表根據使用者名稱查詢。
組合索引:使用多個字段建立索引,遵循最左原則,比如建立索引(col1 + col2 + col3),相當於建立了(col1)、(col1,col2)、(col,col2,col3)三個索引。
全文索引:
2、聚簇索引與非聚簇索引(待完善)
mysql的innodb主鍵使用的是聚簇索引,myisam 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。
非聚簇索引(右圖),表資料和索引是分成兩部分儲存的,主鍵索引和二級索引儲存上沒有任何區別。使用的是b+樹作為索引的儲存結構,所有的節點都是索引,葉子節點儲存的是索引+索引對應的記錄的位址。
聚簇索引(左圖),表資料是和主鍵一起儲存的,主鍵索引的葉結點儲存行資料(包含了主鍵值),二級索引的葉結點儲存行的主鍵值。使用的是b+樹作為索引的儲存結構,非葉子節點都是索引關鍵字,但非葉子節點中的關鍵字中不儲存對應記錄的具體內容或內容位址。葉子節點上的資料是主鍵與具體記錄(資料內容)。
聚簇索引優點:
①當你需要取出一定範圍內的資料時,用聚簇索引也比用非聚簇索引好。
②當通過聚簇索引查詢目標資料時理論上比非聚簇索引要快,因為非聚簇索引定位到對應主鍵時還要多一次目標記錄定址,即多一次i/o
聚簇索引缺點:
①插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁**,嚴重影響效能。因此,對於innodb表,我們一般都會定義乙個自增的id列為主鍵。
②更新主鍵的代價很高,因為將會導致被更新的行移動。因此,對於innodb表,我們一般定義主鍵為不可更新。
③二級索引訪問需要兩次索引查詢,第一次找到主鍵值,第二次根據主鍵值找到行資料。
④採用聚簇索引插入新值比採用非聚簇索引插入新值的速度要慢很多,因為插入要保證主鍵不能重複,判斷主鍵不能重複,採用的方式在不同的索引下面會有很大的效能差距,聚簇索引遍歷所有的葉子節點,非聚簇索引也判斷所有的葉子節點,但是聚簇索引的葉子節點除了帶有主鍵還有記錄值,記錄的大小往往比主鍵要大的多。這樣就會導致聚簇索引在判定新記錄攜帶的主鍵是否重複時進行昂貴的i/o代價。
3、索引實踐(待完善)
#建立班級表
create table class
pid integer not null auto_increment,
class_code varchar(200) not null,
class_name varchar(200) not null,
created_by varchar(200),
created_date date,
updated_by varchar(200),
updated_date date,
constraint pk_class_pid primary key(pid)
#插入資料
insert into stu.class (class_code,class_name,created_by,created_date,updated_by,updated_date)
values
( 『1-001『, 『一年級1班『,『system『, now(),『system『,now()),
( 『1-002『, 『一年級2班『,『system『, now(),『system『,now()),
( 『2-001『, 『二年級1班『,『system『, now(),『system『,now()),
( 『2-002『, 『二年級2班『,『system『, now(),『system『,now());
#使用主鍵索引
#建立普通索引
create index idx_class_class_code on class(class_code);
#使用索引
#建立組合索引
create index idx_class_class_code_name on class(class_code,class_name);
#使用索引
explain
select * from class where class_code = 『2-001『 and class_name = 『一年級2班『;
#使用索引,組合索引所有欄位與順序無關
explain
select * from class where class_name = 『一年級2班『 and class_code = 『2-001『;
#組合索引只使用第乙個欄位時,索引可生效
#刪除索引
#未使用索引,遵循最左原則
explain
select * from class where class_name = 『一年級2班『;
#建立唯一索引
create unique index idx_uq_class_class_code on class(class_code);
#刪除已有的組合索引
drop index idx_class_class_code_name on class;
#使用唯一索引
mysql 雜湊索引 MySQL索引之雜湊索引
雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...
mysql主鍵索引 MySQL索引之主鍵索引
在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...
mysql聚集索引 MySQL索引之聚集索引介紹
在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...