max()的优化
例如:explain select max(`payment_date`) from payment; 可以查看到row的行数非常的多,也就是说扫描了整张表。
为payment_date加上一个索引。
create index idx_payment on payment (`payment_date`);
执行sql语句 explain select max(`payment_date`) from payment order by payment_date; 可以看到rows为null。
extra: select tables optinized away;
并没有扫描整个表,只是通过索引拿出。
索引是通过顺序排列的,所以,通过索引的统计信息就非常清楚的知道,最后一个payment_date的数值是什么样子的。因此并不需要对表的操作,这样就大大的增加了这条sql的执行效率,同时尽可能大的减少了IO操作,这样的话,不管数据量有多大,执行效率基本上是恒定的。
思路:对于max()的查询,可以通过索引的方式来优化它。
count(*)和count(num)的区别
如果num某行为null,count(num)是不包含在内的。而count(*)这是会包含在内的。这就是为什么有时会出现差异的原因。
例如:
id num
1 1
2 2
3 null
count(*)=3 但是 count(id)=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 中心优化思想:避免数据量大时扫描过多的记录。