MySQL單列索引和組合索引的區別介紹

2021-06-16 17:18:26 字數 1717 閱讀 6953

mysql單列索引是我們使用mysql資料庫中經常會見到的,mysql單列索引和組合索引的區別可能有很多人還不是十分的了解,下面就為您分析兩者的主要區別,供您參考學習。

為了形象地對比兩者,再建乙個表:

create table myindex ( i_testid int not null auto_increment, 

vc_name varchar(50) not null, 

vc_city varchar(50) not null, i_age int not null, i_schoolid int not null, 

primary key (i_testid) );

在這 10000 條記錄裡面 7 上 8 下地分布了 5 條 vc_name="erquan" 的記錄,只不過 city,age,school 的組合各不相同。

來看這條t-sql:

select i_testid from myindex where vc_name='erquan' and vc_city='鄭州' and i_age=25;

首先考慮建mysql單列索引:

在vc_name列上建立了索引。執行 t-sql 時,mysql 很快將目標鎖定在了vc_name=erquan 的 5 條記錄上,取出來放到一中間結果集。在這個結果集裡,先排除掉 vc_city 不等於"鄭州"的記錄,再排除 i_age 不等於 25 的記錄,最後篩選出唯一的符合條件的記錄。

雖然在 vc_name 上建立了索引,查詢時mysql不用掃瞄整張表,效率有所提高,但離我們的要求還有一定的距離。同樣的,在 vc_city 和 i_age 分別建立的mysql單列索引的效率相似。

為了進一步榨取 mysql 的效率,就要考慮建立組合索引。就是將 vc_name,vc_city,i_age 建到乙個索引裡:

alter table myindex add index name_city_age (vc_name(10),vc_city,i_age);

建表時,vc_name 長度為 50,這裡為什麼用 10 呢?因為一般情況下名字的長度不會超過 10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高 insert 的更新速度。

執行 t-sql 時,mysql 無須掃瞄任何記錄就到找到唯一的記錄。

肯定有人要問了,如果分別在 vc_name,vc_city,i_age 上建立單列索引,讓該錶有 3 個單列索引,查詢時和上述的組合索引效率一樣嗎?大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但 mysql 只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了

vc_name,vc_city,i_age vc_name,vc_city vc_name

這樣的三個組合索引!為什麼沒有 vc_city,i_age 等這樣的組合索引呢?這是因為 mysql 組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個 t-sql 會用到:

select * from myindex whree vc_name="erquan" and vc_city="鄭州"

select * from myindex whree vc_name="erquan"

而下面幾個則不會用到:

select * from myindex whree i_age=20 and vc_city="鄭州" 

select * from myindex whree vc_city="鄭州"

MySQL單列索引和組合索引

單列索引,顧名思義也就是只有乙個欄位的索引列。組合索引,又稱復合索引,兩個或更多個列上的索引被稱作復合索引。對於復合索引,他們都遵循左側原則,也是就是說乙個查詢可以只使用復合索引最左側的一部份。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,...

MySQL中的單列索引和組合索引

從資料庫角度看索引 有b 樹索引和hash索引。從物理角度看索引 有聚集索引和非聚集索引。而從邏輯角度看索引 有單列索引和組合索引。單列索引 即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引 即乙個索包含多個列。注 1.在mysql中執行查詢時,只能使用乙個索引,如果我們...

MySQL單列索引和組合索引的建立及區別介紹

mysql單列索引是我們使用mysql資料庫中經常會見到的,mysql單列索引和組合索引的區別可能有很多人還不是十分的了解,下面就為您分析兩者的主要區別,供您參考學習。為了形象地對比兩者,再建乙個表 create table myindex i testid int not null auto in...