MYSQL 索引优化

primary key 主键索引

index 普通索引

full text 全文索引,一般比较少用到

spatial 空间索引,和GIS地理有关,很少用到

 

t1表

id name class
1 aa 555
2 bb2 222
3 aa1 111
4 bb1 555
5 cc1 333
6 dd 888
7 dd 666

 


select * from t1 group by class;

默认排序列表出结果,如加上 select * from t1 group by class ordey by null;

则减少排序减少资源占用

group by 后面的字段也不需要索引,用了索引还是要全表查询!

select * from t1 group by class having class>100;

having 后的条件一定要在搜索中的结果中有,换句说group by中含有 class做为组合所以having不会报错,如select * from t1 group by class having id>1; *中含有id,不会报错

但 select name,class from t1 group by class having id>1; 由于group by class 和name,class都不包含id就会报错! 

总之,having后的条件一定要体现在SQL语句的搜索中,不然会报错!

相反,order by ,where 则没有这样的限制!

还有一点特别重要,group by 和where不能同时出现在SQL语句中,不能共存

select id,name,class from one group by class having id>1;

可行,但

select id,name,class from one group by class where id>1;

就会报错!

select * from one where id>1;和 select * from one having id>1;获得结果是一样的,但哪个更高效呢?当然是where了,having是搜索出结果把数据取出来后把不符合条件的数据行剔除,而where是在数据的搜索过程中把不符合条件的数据行剔除,根本没有取出不符合条件的数据行,所以显得更高效!


desc select * from t1 where class='555';

若没有在class做index 索引则全表搜索,做了索引index,则是索引搜索!!!

若在name和class 上做了复合索引,依据左向原则,还是要全表搜索

若是desc select * from t1 where name='dd'; 则用上了索引,所以做复合索引时最好把where后的第一个条件经常使用的做左项索引,就是排在前面!!!

若是select * from t1 where name='dd' and class='888' 则最好name,class做成复合索引

order by 后面不需要做索引.如

 desc select * from one order by name desc limit 1,3;

order by 不会去索引文件中搜索查询,用了索引也没有用