码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-10-01 12:56:18      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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


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

标签:

原文地址:http://my.oschina.net/woshixiaomayi/blog/513066

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!