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 不会去索引文件中搜索查询,用了索引也没有用