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...