小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法

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 中心优化思想:避免数据量大时扫描过多的记录。

相关文章
相关标签/搜索