在MySQL的where條件中,有時會用到很多的條件,通常為了加快速度會把這些字段放到聯合索引中,可以更快的提高搜索速度;
但是對聯合索引中字段順序的合理排序,便更能提高速度
例子:select * from table where (groupid=1000) and (userid=500) and (time=140012345)
建立的索引也通常很隨性的就按照where條件中字段的順序建立
ALTER TABLE table ADD INDEX g_u_time_index(groupid,userid,time);
那么MySQL就會先檢索到groupid=1000的所有數據,假如搜到了1000條,再在檢索到的1000條數據中再檢索userid=500的數據,假設還剩余300條,再在300條中搜索time=140012345的數據,假設就剩了100條;這樣總共搜索了1000+300+100=1400條數據才找到符合的100條
但是為了更好的優化,我們現在需要在建立索引前,對這幾個字段進行計算,計算他們在表中所占的比例
可以寫一個select語句來查看:計算各個條件在表中所占的比例大小
select count(*) total,sum(groupid=1000) gtotal,sum(userid=500) utotal,sum(time=1400123456) time from table;
total 10000
gtotal 1000
utotal 300
time 800
可見如果先搜索島userid=500的數據就可以剔除掉一大半,只剩下300條符合的,再在300中搜索符合time=1400123456和groupid=1000的數據,這樣就大大縮減了查詢次數;
按照從小到大的順序排列,可以減少搜索次數
sql改為:select * from table where (userid=500) and (time=140012345) and (groupid=1000)
ALTER TABLE table ADD INDEX g_u_time_index ( userid , time , groupid)
參考:《高性能MySQL》第五章創建高性能索引
