對mysql聯合索引中的字段進行合理排序


在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》第五章創建高性能索引

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM