MySql官方文档翻译之Select查询语句where限定条件优

2020-07-28  本文已影响0人  一个没有感情的程序员

针对官方文档的翻译,并加入一些比较难理解的补充说明,以下为译文:
:该文档的意思是以下优化正常情况是由mysql自动优化,即不用刻意优化。
本节讨论可以如何处理查询语句WHERE子句的优化。这些示例使用 SELECT语句,但是对DELETE和UPDATE 语句中的WHERE子句也可以进行相同的优化。
您可能会想优化sql查询以使查询效率更快,但是优化的同时又牺牲了可读性。由于MySQL自动进行类似的优化,因此您通常可以避免这项工作,而将查询保留为更易于理解和维护的形式。MySQL自动执行的一些优化如下:

((a AND b) AND c OR (((a AND b) AND (c AND d))))
优化后-> 
(a AND b AND c) OR (a AND b AND c AND d)
(a<b AND b=c) AND a=5
优化后-> 
b>5 AND b=c AND a=5

(b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=7 AND 5=6)
优化后-> 
b=5 OR b=6
优化程序可以解析为常量的任何表达式都被解析为常量,而不是针对每一行进行求值。
WHERE start_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
如果今天运行,该查询将完全等同于
WHERE start_date >= '2018-04-25'
所以不需要每次都计算,mysql会自动计算出值再使用常量比较
个人理解:在使用多表联表查询的时候
1、执行FROM语句(以基准表做笛卡尔积)
2、执行ON过滤
3、添加外部行
4、执行where条件过滤
5、执行group by分组语句
6、执行having
7、select列表
8、执行distinct去重复数据
9、执行order by字句
10、执行limit字句

所以来说,如果是大表联表查询,mysql会把步骤4提前,先用where过滤数据,再用join联表查询

select * from table1 a left join table2 b on a.id=b.id where a.type=xxxxx and b.type=xxxxx 
等同于:
select * from
 (select * from table1 where type=xxx) a 
left join
 (select * from table2 where type=xxx) b 
on a.id =b.id
这里直翻不太顺,这个大概意思是可以常量查询(一行,或者带索引的查询)mysql会优先放在前面执行

常量查询即如下:
SELECT * FROM t WHERE primary_key=1;

待优化查询:
SELECT * FROM t1,t2
  WHERE  t2.primary_key=t1.id AND t1.primary_key=1;
mysql自动优化后查询:
SELECT * FROM t1,t2
  WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
上一篇 下一篇

猜你喜欢

热点阅读