max()的优化sql
例如:explain select max(`payment_date`) from payment; 能够查看到row的行数很是的多,也就是说扫描了整张表。优化
为payment_date加上一个索引。索引
create index idx_payment on payment (`payment_date`);ip
执行sql语句 explain select max(`payment_date`) from payment order by payment_date; 能够看到rows为null。it
extra: select tables optinized away;io
并无扫描整个表,只是经过索引拿出。table
索引是经过顺序排列的,因此,经过索引的统计信息就很是清楚的知道,最后一个payment_date的数值是什么样子的。所以并不须要对表的操做,这样就大大的增长了这条sql的执行效率,同时尽量大的减小了IO操做,这样的话,无论数据量有多大,执行效率基本上是恒定的。效率
思路:对于max()的查询,能够经过索引的方式来优化它。date
count(*)和count(num)的区别file
若是num某行为null,count(num)是不包含在内的。而count(*)则是会包含在内的。这就是为何有时会出现差别的缘由。
例如:
id num
1 1
2 2
3 null
count(*)=3 可是 count(num)=2
子查询的优化
子查询用链接方式查询时要注意是不是1对多的关系,若是是,数据结果就会出现重复,须要用distinct去重。
limit()优化
优化步骤1:使用有索引的列或者主键的列进行order by操做。道理和max()同样。
优化步骤2:记录上次返回的主键,在下次查询时使用主键过滤。
例如:select file_id,description from file where file_id >55 and file_id <= 60 order by film_id limit 1,5;
这种作法的缺点是万一主键缺失的状况下,拿出来的就不必定是5条了。
d=====( ̄▽ ̄*)b 中心优化思想:避免数据量大时扫描过多的记录。