COUNT(*) 忽略所有列,直接统计所有行数。当没有条件时;可以通过MySQL的存储引擎直接获取对应的值。
COUNT一般都需要扫描大量的行,即大量的数据访问。比较难优化,善用补集进行替代,减少扫描数量
尽量使用关联查询代替
尽量使用偏移+数量,尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回需要的列。例如:
SELECT film_id,description FROM sakila.film ORDER BY title LIMIT 50,5; # 改写成下面的样子,使用索引再进行筛选 SELECT film.film_id,film.description FROM saklia.film INNER JOIN( SELECT film_id FROM sakila.film ORDER BY title LIMIT 50,5 ) AS lim USING(film_id);这个使用再LIMIT之后会额昂MySQL扫描满足条件的所有行,再进行筛选。而不是数量足够之后就停止了。
MySQL总是通过创建临时表的方式来执行UNION查询;没有需要消除重复行是,一定使用UNION ALL;这样MySQL就不会给临时表加上DISTINCT选项(对临时表做唯一性检查)
例如:
SET @last_week:=CURRENT_DATE-INTERVAL 1 WEEK; SELECT ... WHERE col <= @last_week;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZavkaVQ-1602155910632)(https://wangpengcheng.github.io/img/2020-02-12-23-49-58.png)]
优化都是:不做,少做,快速地做
