【MySQL】基于MySQL的SQL优化(四)——对group by以及limit的优化

*本文章使用数据均来自MySQL样本数据库Sakila,参考:https://blog.csdn.net/tanglei6636/article/details/93042010

group by:

通过下面一条 语句来了解有关group by的优化。

SELECT a.first_name,a.last_name,COUNT(*) FROM film_actor fa INNER JOIN actor a USING(actor_id) GROUP BY fa.actor_id;

GROUP BY优化前
如图,这条SQL语句在执行时使用到了临时表(temporary)并用到了文件排序(filesort),在我们的SQL中要尽量减少临时表的使用,由于这条SQL没有任何的WHERE条件,所以用到ALL表扫描也是在所难免的。
优化方法:

EXPLAIN SELECT a.first_name,a.last_name,t.count FROM actor a INNER JOIN ( 
	SELECT actor_id,COUNT(*) count FROM film_actor fa GROUP BY actor_id 
) t USING(actor_id);

GROUP BY优化后
尽量减少临时表以及文件排序的使用。
但是当WHERE条件增加时,尽量在子查询中添加相应的条件,而不是当所有数据查询结束后在增加相应的过滤条件。


limit:

LIMIT常用于处理分页操作,时常会伴随ORDER BY使用。

SELECT film_id ,description FROM film ORDER BY title LIMIT 50,5;

LIMIT优化前
当配合ORDER BY使用时,常会用的文件排序(filesort)。
优化方式:
1、使用有索引的列或者主键来进行ORDER BY排序。

SELECT film_id ,description FROM film ORDER BY film_id LIMIT 50,5;

LIMIT优化1这样就可以避免使用文件排序来进行ORDER BY操作了,并且使用index来进行搜索,而不是全表扫描了。
2、上面那个SQL会随着LIMIT的行数的变化来增加其扫描行数,当数据行数很多时,还是浪费了大量的 资源进行了扫描。
LIMIT优化2
如图,扫描的行数变多了。
下面我们通过记录上一次返回的主键,在本次查询中使用主键进行过滤,以达到减少扫描行数的目的。
假设上一次扫描的是:从50行开始往后数5行。

SELECT film_id ,description FROM film WHERE film_id > 55 AND film_id <= 60 ORDER BY film_id LIMIT 1,5;

LIMIT优化3
这个可以通过代码的逻辑来进行处理,通过每次传入的值来进行减少扫描行数的操作,在分页时有重要的意义,避免了数据量大时扫描过多记录带来的资源浪费。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值