聯(lián)合索引 (a,b,c)
聯(lián)合索引 (a,b,c) 實(shí)際建立了 (a)烹看、(a,b)实胸、(a,b,c) 三個(gè)索引
我們可以將組合索引想成書的一級目錄菇夸、二級目錄、三級目錄痴怨,如index(a,b,c)酱吝,相當(dāng)于a是一級目錄,b是一級目錄下的二級目錄欠啤,c是二級目錄下的三級目錄熄阻。要使用某一目錄膘掰,必須先使用其上級目錄啸驯,一級目錄除外客扎。
如下:
where a=1 and c=1
只使用了一級目錄,c在三級目錄罚斗,沒有使用二級目錄徙鱼,那么三級目錄就沒法使用
where a=1 and b=1
只使用了一級目錄、二級目錄针姿。
聯(lián)合索引的優(yōu)勢
減少開銷:建一個(gè)聯(lián)合索引 (a,b,c) 袱吆,實(shí)際相當(dāng)于建了 (a)、(a,b)距淫、(a,b,c) 三個(gè)索引绞绒。每多一個(gè)索引,都會(huì)增加寫操作的開銷和磁盤空間的開銷榕暇。對于大量數(shù)據(jù)的表蓬衡,使用聯(lián)合索引會(huì)大大的減少開銷!
覆蓋索引:對聯(lián)合索引 (a,b,c)彤枢,如果有如下 sql 的狰晚,
SELECT a,b,c from table where a='xx' and b = 'xx';
那么 MySQL 可以直接通過遍歷索引取得數(shù)據(jù),而無需回表缴啡,這減少了很多的隨機(jī) io 操作壁晒。減少 io 操作,特別是隨機(jī) io 其實(shí)是 DBA 主要的優(yōu)化策略业栅。所以秒咐,在真正的實(shí)際應(yīng)用中,覆蓋索引是主要的提升性能的優(yōu)化手段之一碘裕。
- 效率高
索引列多携取,通過聯(lián)合索引篩選出的數(shù)據(jù)越少。比如有 1000W 條數(shù)據(jù)的表帮孔,有如下SQL:
select col1,col2,col3 from table where col1=1 and col2=2 and col3=3;
假設(shè):假設(shè)每個(gè)條件可以篩選出 10% 的數(shù)據(jù)雷滋。
A. 如果只有單列索引,那么通過該索引能篩選出 1000W10%=100w 條數(shù)據(jù)你弦,然后再回表從 100w 條數(shù)據(jù)中找到符合 col2=2 and col3= 3 的數(shù)據(jù)惊豺,然后再排序燎孟,再分頁禽作,以此類推(遞歸);
B. 如果是(col1,col2,col3)聯(lián)合索引揩页,通過三列索引篩選出 1000w10% 10% *10%=1w旷偿,效率提升可想而知!
索引是建的越多越好嗎?答案自然是否定的
- 數(shù)據(jù)量小的表不需要建立索引,建立會(huì)增加額外的索引開銷
- 不經(jīng)常引用的列不要建立索引萍程,因?yàn)椴怀S么蓖词菇⒘怂饕矝]有多大意義
- 經(jīng)常頻繁更新的列不要建立索引,因?yàn)榭隙〞?huì)影響插入或更新的效率
- 數(shù)據(jù)重復(fù)且分布平均的字段茫负,因此他建立索引就沒有太大的效果(例如性別字段蕉鸳,只有男女,不適合建立索引)
- 數(shù)據(jù)變更需要維護(hù)索引忍法,意味著索引越多維護(hù)成本越高潮尝。
- 更多的索引也需要更多的存儲(chǔ)空間