入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2016-10-19 投稿人: 浏览次数:1021

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

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。