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