谓词下推

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxm1306192988/article/details/80255747

优化关系 SQL 查询的一项基本技术是,将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引。

这在分区数据库环境中甚至更为重要,其原因在于,提早进行过滤有可能减少必须在数据库分区之间传递的数据量。

此优化技术在 SQL 中被称为谓词下推(Predicate pushdown) 。
基本策略是,始终将过滤表达式尽可能移至靠近数据源的位置。

事实主流的数据库基本上都支持这种方式的优化。其原则是在一个查询树中,对于任何选择都尽量早做选择,然后进行一步的处理.可见我们并不需要改写这个sql,优化器会自动去帮我们做这种优化.

如:
有表:
t_student(student_id, student_name, student_age)
t_score(score_id, student_id, course_id, score_number)

优化的sql:

EXPLAIN SELECT * FROM t_student t1 right JOIN (
SELECT * from t_score WHERE score_id=2
) t2
ON t1.student_id=t2.student_id;

先看 id 为2的行,先查询 t_score,由于有 score_id=2 根据主键索引直接查到对应行;
然后看 第一行,查询id为2 行生成的临时表,表中只有一条记录,所以查询类型为 system;
最后运行 第二行,直接根据 上面查到行的 student_id 根据 t1 表的主键索引直接找到。

这里写图片描述

优化前的sql:

EXPLAIN SELECT *
FROM t_student,t_score
WHERE t_score.student_id=t_student.student_id
AND t_score.score_id=2;

这里写图片描述

可以看到先查询 t_score 表,ref 为 const 类型,说明 使用了过滤条件 t_score.score_id=2 ;
即 在 扫描 t_score 表时就使用了过滤条件,而不是等到和 t_student 表连接之后才过滤。
这就说明 mysql 优化器使用了谓词下推技术 对我们的sql 语句进行了优化。

没有更多推荐了,返回首页