innodb索引概念
總結記錄下innodb的索引概念,以備檢視
innodb索引分類:
聚簇索引(clustered index)
1) 有主鍵時,根據主鍵建立聚簇索引
2) 沒有主鍵時,會用乙個唯一且不為空的索引列做為主鍵,成為此表的聚簇索引
3) 如果以上兩個都不滿足那innodb自己建立乙個虛擬的聚集索引
輔助索引(secondary index)
非聚簇索引都是輔助索引,像復合索引、字首索引、唯一索引
myisam索引:因為myisam的索引和資料是分開儲存儲存的,myisam通過key_buffer把索引先快取到記憶體中,當需要訪問資料時(通過索引訪問資料),在記憶體中直接搜尋
索引,然後通過索引找到磁碟相應資料,這也就是為什麼索引不在key buffer命中時,速度慢的原因
innodb索引:innodb的資料和索引放在一起,當找到索引也就找到了資料
自適應雜湊索引:innodb會監控表上的索引使用情況,如果觀察到建立雜湊索引可以帶來速度的提公升,那就建立雜湊索引,自 適應雜湊索引通過緩衝池的b+樹構造而來,
因此建立的速度很快,不需要將整個表都建雜湊索引,innodb 儲存引擎會自動根據訪問的頻率和模式來為某些頁建立雜湊索引。自適應雜湊索引不需要
儲存磁碟的,當停庫內容會丟失,資料庫起來會自己建立,慢慢維護索引。
聚簇索引:
mysql innodb一定會建立聚簇索引,把實際資料行和相關的鍵值儲存在一塊,這也決定了乙個表只能有乙個聚簇索引,即mysql不會一次把資料行儲存在二個地方。
1) innodb通常根據主鍵值(primary key)進行聚簇
2) 如果沒有建立主鍵,則會用乙個唯一且不為空的索引列做為主鍵,成為此表的聚簇索引
3) 上面二個條件都不滿足,innodb會自己建立乙個虛擬的聚集索引
優點:聚簇索引的優點,就是提高資料訪問效能。聚簇索引把索引和資料都儲存到同一棵b+樹資料結構中,並且同時將索引列與相關資料行儲存在一起。這意味著,當你訪問同一資料頁不同行記錄時,已經把頁載入到了buffer中,再次訪問的時候,會在記憶體中完成訪問,不必訪問磁碟。不同於myisam引擎,它將索引和資料沒有放在一塊,放在不同的物理檔案中,索引檔案是快取在key_buffer中,索引對應的是磁碟位置,不得不通過磁碟位置訪問磁碟資料。
缺點:1) 維護索引很昂貴,特別是插入新行或者主鍵被更新導至要分頁(page split)的時候。建議在大量插入新行後,選在負載較低的時間段,通過optimize table優化表,因為必須被移動的行資料可能造成碎片。使用獨享表空間可以弱化碎片
2) 表因為使用uuid作為主鍵,使資料儲存稀疏,這就會出現聚簇索引有可能有比全表掃面更慢,所以建議使用int的auto_increment作為主鍵
3) 如果主鍵比較大的話,那輔助索引將會變的更大,因為輔助索引的葉子儲存的是主鍵值;過長的主鍵值,會導致非葉子節點占用占用更多的物理空間
輔助索引
在聚簇索引之上建立的索引稱之為輔助索引,輔助索引訪問資料總是需要二次查詢。輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到資料行的資料葉,再通過資料葉中的page directory找到資料行。
復合索引
由多列建立的索引稱為符合索引,在符合索引中的前導列必須出現在where條件中,索引才會被使用
alter table `test`.`users` add index `idx_users_id_name` (`name`(10) asc, `id` asc) ;
字首索引
當索引的字串列很大時,建立的索引也就變得很大,為了減小索引體積,提高索引的掃瞄速度,就用索引的前部分字串索引,這樣索引占用的空間就會大大減少,並且索引的選擇性也不會降低很多。而且是對blob和text列進行索引,或者非常長的varchar列,就必須使用字首索引,因為mysql不允許索引它們的全部長度。
使用:列的字首的長度選擇很重要,又要節約索引空間,又要保證字首索引的選擇性要和索引全長度選擇性接近。
唯一索引
唯一索引比較好理解,就是索引值必須唯一,這樣的索引選擇性是最好的
主鍵索引
主鍵索引就是唯一索引,不過主鍵索引是在建立表時就建立了,唯一索引可以隨時建立。
說明主鍵和唯一索引區別
1) 主鍵是主鍵約束+唯一索引
2) 主鍵一定包含乙個唯一索引,但唯一索引不是主鍵
3) 唯一索引列允許空值,但主鍵列不允許空值
4) 乙個表只能有乙個主鍵,但可以有多個唯一索引
索引掃瞄方式:
緊湊索引掃瞄(dense index):
在最初,為了定位資料需要做權表掃瞄,為了提高掃瞄速度,把索引鍵值單獨放在獨立的資料的資料塊裡,並且每個鍵值都有個指向原資料塊的指標,因為索引比較小,掃瞄索引的速度就比掃瞄全表快,這種需要掃瞄所有鍵值的方式就稱為緊湊索引掃瞄
鬆散索引掃瞄(sparse index):
為了提高緊湊索引掃瞄效率,通過把索引排序和查詢演算法(b+trre),發現只需要和每個資料塊的第一行鍵值匹配,就可以判斷下乙個資料塊的位置或方向,因此有效資料就是每個資料塊的第一行資料,如果把每個資料塊的第一行資料建立索引,這樣在這個新建立的索引上折半查詢,資料定位速度將更快。這種索引掃瞄方式就稱為鬆散索引掃瞄。
覆蓋索引掃瞄(covering index):
包含所有滿足查詢需要的資料的索引稱為覆蓋索引,即利用索引返回select列表中的字段,而不必根據索引再次讀取資料檔案
索引相關常用命令:
1) 建立主鍵
create table `pk_tab2` (
`id` int(11) not null auto_increment,
`a1` varchar(45) default null,
primary key (`id`)
) engine=innodb default charset=utf8;
2) 建立唯一索引
create unique index indexname on tablename(columnname);
alter table tablename add unique index indexname(columnname);
3) 建立單列一般索引
create index indexname on tablename(columnname);
alter table tablename add index indexname(columnname);
4) 建立單列字首索引
create index indexname on tablename(columnname(10)); //單列的前10個字元建立字首索引
alter table tablename add index indexname(columnname(10)); //單列的前10個字元建立字首索引
5) 建立復合索引
create index indexname on tablename(columnname1,columnname2); //多列的復合索引
create index indexname on tablename(columnname1,columnname2(10)); //多列的包含字首的復合索引
alter table tablename add index indexname(columnname1,columnname2); //多列的復合索引
alter table tablename add index indexname(columnname1,columnname(10)); //多列的包含字首的復合索引
6) 刪除索引
drop index indexname on tablename;;
alter table tablename drop index indexname;
7) 檢視索引
show index from tablename;
show create table pk_tab2;
--------end--------
InnoDB索引實現
1 innodb的資料檔案本身就是索引檔案。從上文知道,myisam索引檔案 是分離的,索引檔案僅儲存資料記錄的位址。而在innodb中,表資料 檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉節點data域 儲存了完整的資料記錄,這個索引的key是資料表的主鍵,因此innodb 表資料檔案...
innodb的索引機制
1 innodb將資料和索引儲存在一起 2 innodb索引是基於b tree的clustered index,b tree中的每個結點儲存key row data innodb中的第二個索引儲存,在搜尋時,先通過key找到pk,再通過pk搜尋b tree的結點,從中找到row data 3 由於聚...
innoDB 全文索引
當b 樹無法滿足索引要求時,比如根據前幾個關鍵字來查詢所有相關資料。innodb 1.2.x版本開始支援全文檢索 全文檢索一般使用倒排索引來實現。倒排索引和b 樹一樣也是一種索引結構,它在輔助表中儲存了單詞與單詞自身在乙個或多個文件中所在位置的對映 1對多 主要有兩種表現形式 比如乙個表t儲存的內容...