使用 limit 优化查询和防止SQL被优化
Table of Contents
查询优化
1.1 最大值和最小值的优化
对于 MIN() 和 MAX() 查询, MySQL 而且优化做得并不是太好,例如
select MIN(id) FROM film where name = '西游记';复制代码
假设表 film 数据如下:
则执行SQL select * from film group by name , 则结果为:
但在一些数据重复时,我们往往想要最后一条数据, 这是我们会想到通过子查询的形式先排序后group by 如下:
select *from ( select * from film order by id desc) as film_orderedgroup by name;复制代码
执行后发现结果没变, 这是因为 MySQL5.7 会对子查询进行优化,认为子查询中的 order by 可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:
- UNION clause
- GROUP BY
- DISTINCT
- Aggregation
- LIMIT or OFFSET
根据上面说明,我们可以使用 limit 阻止子查询优化,改写后SQL
select *from ( select * from film order by id desc limit 10000000) as film_orderedgroup by name;复制代码
这样结果就符合我们想要的了