MySQL聚集索引和非聚集索引

2022-04-29 01:30:09 字數 1598 閱讀 6658

mysql的innodb儲存引擎的索引分為聚集索引和非聚集索引兩大類,理解聚集索引和非聚集索引可通過對比漢語字典的索引。漢語字典提供了兩類檢索漢字的方式,第一類是拼音檢索(前提是知道該漢字讀音),比如拼音為cheng的漢字排在拼音chang的漢字後面,根據拼音找到對應漢字的頁碼(因為按拼音排序,二分查詢很快就能定位),這就是我們通常所說的字典序;第二類是部首筆畫檢索,根據筆畫找到對應漢字,查到漢字對應的頁碼。拼音檢索就是聚集索引,因為儲存的記錄(資料庫中是行資料、字典中是漢字的詳情記錄)是按照該索引排序的;筆畫索引,雖然筆畫相同的字在筆畫索引中相鄰,但是實際儲存頁碼卻不相鄰。

正文內容按照乙個特定維度排序儲存,這個特定的維度就是聚集索引;

innodb儲存引擎中行記錄就是按照聚集索引維度順序儲存的,innodb的表也稱為索引表;因為行記錄只能按照乙個維度進行排序,所以一張表只能有乙個聚集索引。

非聚集索引索引項順序儲存,但索引項對應的內容卻是隨機儲存的;

舉個例子說明下:

create table student (

`id` int  unsigned auto_increment,

`name`  varchar(255),

primary key(`id`),

key(`name`)

) engine=innodb default charset=utf8;

該表中主鍵id是該錶的聚集索引、name為非聚集索引;表中的每行資料都是按照聚集索引id排序儲存的;比如要查詢name='arla'和name='arle'的兩個同學,他們在name索引表中位置可能是相鄰的,但是實際儲存位置可能差的很遠。name索引表節點按照name排序,檢索的是每一行資料的主鍵。聚集索引表按照主鍵id排序,檢索的是每一行資料的真實內容。

也就是說查詢name='arle'的記錄時,首相通過name索引表查詢到arle的主鍵id(可能有多個主鍵id,因為有重名的同學),再根據主鍵id的聚集索引找到相應的行記錄;

mysql聚集索引和非聚集索引最簡單的表述:

聚集索引一般是表中的主鍵索引,如果表中沒有顯示指定主鍵,則會選擇表中的第乙個不允許為null的唯一索引,如果還是沒有的話,就採用innodb儲存引擎為每行資料內建的6位元組rowid作為聚集索引。

每張表只有乙個聚集索引,因為聚集索引在精確查詢和範圍查詢方面良好的效能表現(相比於普通索引和全表掃瞄),聚集索引就顯得彌足珍貴,聚集索引選擇還是要慎重的(一般不會讓沒有語義的自增id充當聚集索引)。

從巨集觀上分析下聚集索引和普通索引的效能差異,還是針對上述student表:

(1)select * from student where id >5000 and id <20000;

(2)select * from student where name > 'alie' and name < 'john';

第一條sql語句根據id進行範圍查詢,因為(5000, 20000)範圍內的記錄在磁碟上按順序儲存,通過順序讀取磁碟很快就能讀到這批資料。

第二條sql語句查詢('alie', 'john')範圍內的記錄,主鍵id分布可能是離散的1,100,20001,5000.....;增加了隨機讀取資料頁機率;所以普通索引的範圍查詢效率被聚集索引甩開幾條街都不止;非聚集索引的精確查詢效率還是可以的,比聚集索引查詢只增加了一次io開銷。

聚集索引和非聚集索引

聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...

聚集索引和非聚集索引

本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...

聚集索引和非聚集索引

聚集索引和非聚集索引 1 聚集索引 聚集索引,表中的資料儲存位置,根據索引的排序進行實際儲存,因此效率是相當高的。因為聚集索引決定了表中資料行的儲存位置。乙個表不可能有兩個或以上的聚集索引,如果乙個表中已經有乙個聚集索引,那麼這個表中其他的索引都將是非聚集索引。表排列順序 表記錄的排列順序與索引的排...