优化特定类型的查询

    科技2026-01-02  9

    优化特定类型的查询

    优化COUNT()查询

    COUNT(*) 忽略所有列,直接统计所有行数。当没有条件时;可以通过MySQL的存储引擎直接获取对应的值。

    COUNT一般都需要扫描大量的行,即大量的数据访问。比较难优化,善用补集进行替代,减少扫描数量

    优化关联查询

    确保ON或者USING子句中的列上有索引;确保任何的GROUP BY 和ORDER BY中的表达式只涉及到一个表中的列,这样MySQL才有可能使用索引来优化这个过程。升级MySQL时需要注意关联语法的变化。

    优化子查询

    尽量使用关联查询代替

    优化LIMIT分页

    尽量使用偏移+数量,尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回需要的列。例如:

    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);

    优化SQL_CALC_FOUND_ROWS

    这个使用再LIMIT之后会额昂MySQL扫描满足条件的所有行,再进行筛选。而不是数量足够之后就停止了。

    优化UNION 查询

    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)]

    优化都是:不做,少做,快速地做

    Processed: 0.015, SQL: 9