【MySQL】基于MySQL的SQL优化(四)——对group by以及limit的优化
2016-10-19 17:23
661 查看
group by:
通过下面一条 语句来了解有关group by的优化。
如图,这条SQL语句在执行时使用到了临时表(temporary)并用到了文件排序(filesort),在我们的SQL中要尽量减少临时表的使用,由于这条SQL没有任何的WHERE条件,所以用到ALL表扫描也是在所难免的。
优化方法:
尽量减少临时表以及文件排序的使用。
但是当WHERE条件增加时,尽量在子查询中添加相应的条件,而不是当所有数据查询结束后在增加相应的过滤条件。
limit:
LIMIT常用于处理分页操作,时常会伴随ORDER BY使用。
当配合ORDER BY使用时,常会用的文件排序(filesort)。
优化方式:
1、使用有索引的列或者主键来进行ORDER BY排序。
这样就可以避免使用文件排序来进行ORDER BY操作了,并且使用index来进行搜索,而不是全表扫描了。
2、上面那个SQL会随着LIMIT的行数的变化来增加其扫描行数,当数据行数很多时,还是浪费了大量的 资源进行了扫描。
如图,扫描的行数变多了。
下面我们通过记录上一次返回的主键,在本次查询中使用主键进行过滤,以达到减少扫描行数的目的。
假设上一次扫描的是:从50行开始往后数5行。
这个可以通过代码的逻辑来进行处理,通过每次传入的值来进行减少扫描行数的操作,在分页时有重要的意义,避免了数据量大时扫描过多记录带来的资源浪费。
通过下面一条 语句来了解有关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;
这个可以通过代码的逻辑来进行处理,通过每次传入的值来进行减少扫描行数的操作,在分页时有重要的意义,避免了数据量大时扫描过多记录带来的资源浪费。
相关文章推荐
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
- mysql优化(SQL语句的优化以及索引的应用范围)
- 【MySQL】基于MySQL的SQL优化(一)——从用explain关键字分析SQL语句开始
- mysql快速生成测试数据的方法,以及分页limit语句优化
- MySQL的SQL执行性能分析以及性能优化策略和步骤
- MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适
- Java Develop——基于 MySQL 的 SQL 规约/优化记录
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
- MySql带order by与limit的sql优化
- 【MySQL】基于MySQL的SQL优化(三)——对子查询进行优化
- MySQL分组排序取前N条记录以及生成自动数字序列--group by 后 limit 外加 rownumber
- MySQL SQL优化案例:LIMIT M,N大偏移量分页
- 总结mysql不使用索引情况以及如何优化sql语句
- mysql索引以及慢SQL优化记录【转慕课】
- SQL(基于MySQL)——LIMIT用法
- MySql 分页SQL 大数据量limit替代和优化(试验)
- Java Develop——基于 MySQL 的 SQL 规约/优化记录
- 【MySQL】基于MySQL的SQL优化(五)——建立索引优化SQL
- 【MySQL】基于MySQL的SQL优化(二)——对count()、max()的优化
- select * 为什么不好? limit 1 为什么好? --mysql SQL语句优化