您的位置:首页 > 数据库 > MySQL

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

2016-10-19 17:23 661 查看
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;




如图,这条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);




尽量减少临时表以及文件排序的使用。

但是当WHERE条件增加时,尽量在子查询中添加相应的条件,而不是当所有数据查询结束后在增加相应的过滤条件。

limit:

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

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




当配合ORDER BY使用时,常会用的文件排序(filesort)。

优化方式:

1、使用有索引的列或者主键来进行ORDER BY排序。

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



这样就可以避免使用文件排序来进行ORDER BY操作了,并且使用index来进行搜索,而不是全表扫描了。

2、上面那个SQL会随着LIMIT的行数的变化来增加其扫描行数,当数据行数很多时,还是浪费了大量的 资源进行了扫描。



如图,扫描的行数变多了。

下面我们通过记录上一次返回的主键,在本次查询中使用主键进行过滤,以达到减少扫描行数的目的。

假设上一次扫描的是:从50行开始往后数5行。

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




这个可以通过代码的逻辑来进行处理,通过每次传入的值来进行减少扫描行数的操作,在分页时有重要的意义,避免了数据量大时扫描过多记录带来的资源浪费。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐