贛州做網(wǎng)站j營(yíng)銷型網(wǎng)站建設(shè)步驟
MySQL的聚簇索引和非聚簇索引
聚簇索引
聚簇索引是一種索引結(jié)構(gòu),它與數(shù)據(jù)行存儲(chǔ)在一起,即索引的葉子節(jié)點(diǎn)就是數(shù)據(jù)行本身。在MySQL中,主鍵索引就是一種典型的聚簇索引
。
涉及情況
當(dāng)查詢需要按照主鍵或唯一索引進(jìn)行精確查找時(shí),會(huì)涉及到聚簇索引。
數(shù)據(jù)結(jié)構(gòu)
聚簇索引的數(shù)據(jù)結(jié)構(gòu)是B+樹(shù),它的葉子節(jié)點(diǎn)存儲(chǔ)了完整的數(shù)據(jù)行
。
速度
由于數(shù)據(jù)行和索引在一起,所以在使用聚簇索引進(jìn)行查詢時(shí),速度比非聚簇索引更快。
非聚簇索引
非聚簇索引是一種索引結(jié)構(gòu),它的葉子節(jié)點(diǎn)存儲(chǔ)的是指向數(shù)據(jù)行的指針,而不是數(shù)據(jù)行本身。在MySQL中,普通索引就是一種非聚簇索引
。
涉及情況
當(dāng)查詢需要按照非主鍵或非唯一索引進(jìn)行查找時(shí),會(huì)涉及到非聚簇索引。
數(shù)據(jù)結(jié)構(gòu)
非聚簇索引的數(shù)據(jù)結(jié)構(gòu)同樣是B+樹(shù),但它的葉子節(jié)點(diǎn)存儲(chǔ)的是指向數(shù)據(jù)行的指針
。
速度
由于非聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)的是指針而不是完整的數(shù)據(jù)行
,所以在使用非聚簇索引進(jìn)行查詢時(shí),速度相對(duì)較慢。
對(duì)比
- 聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)完整的數(shù)據(jù)行,
速度更快
,適合于按主鍵或唯一索引進(jìn)行精確查找的情況,不需要回表
。 - 非聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)的是指向數(shù)據(jù)行的指針,
速度相對(duì)較慢
,適合于按非主鍵或非唯一索引進(jìn)行查找的情況,需要回表
。
例子
假設(shè)有一個(gè)名為students
的學(xué)生表,包含以下字段:
- id (主鍵)
- name
- age
- gender
- class_id (班級(jí)ID)
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),age INT,gender VARCHAR(10),class_id INT,INDEX idx_name (name),INDEX idx_class_id (class_id)
);
在這個(gè)例子中,id
字段是主鍵,因此它將會(huì)作為聚簇索引。同時(shí),我們創(chuàng)建了兩個(gè)非聚簇索引,分別是按照name
和class_id
字段創(chuàng)建的索引。當(dāng)進(jìn)行按照name
或class_id
進(jìn)行查詢時(shí),將會(huì)涉及到非聚簇索引的使用。