mysql 语句优化优化
前言
我们都会写很多语句,那么如何让语句看起来更加优美呢?
正文
- 移除不必要的括号
((a = 5 AND b = c) OR ((a > c) AND (c < 5)))
=
(a = 5 and b = c) OR (a > c AND c < 5)
- 常量传递
a = 5 AND b > a
可以换成a = 5 AND b > 5
但是or 不行。
比如说:
a = 5 or b > a
!=
a = 5 or b > 5
这里面不行,因为or 是两者之间一个条件满足就可以,b>a != b>5,因为前置条件a = 5不一定为真
- 等值传递
a = b and b = c and c = 5
=
a=5 and b =5 and c = 5
- 移除没用的条件
(a < 1 and b = b) OR (a = 6 OR 5 != 5)
= a < 1 OR a = 6
比如b = b 和 5 != 5 一定为true
- 表达式计算
a = 5 + 1
a = 6
这个可能优化器自动帮忙优化啥的。
但是下面这种事不会帮忙优化的:
ABS(a) > 5
-a<-8
这样子的。
ABS(a) > 5 可以这样写 a>5 or a<-5 这样,不然不会使用索引。
- HAVING子句和WHERE子句的合并
如果查询语句中没有出现诸如 SUM 、 MAX 等等的聚集函数以及 GROUP BY 子句,优化器就把 HAVING 子句和
WHERE 子句合并起来。
- 驱动表的选择问题
SELECT * FROM table1 INNER JOIN table2
ON table1.column1 = table2.column2
WHERE table1.primary_key = 1;
我们知道做连接的时候,mysql 需要去选择哪个是驱动表,哪个是被驱动表。
首先假如是table1的时候呢,那么查询语句就是
SELECT * FROM table1 INNER JOIN table2
ON table1.column1 = table2.column2
WHERE table1.primary_key = 1;
首先假如是table2的时候呢,那么查询语句就是
SELECT * FROM table1 INNER JOIN table2
ON table1.column1 = table2.column2
那么显然这个时候选table1
外连接和内连接的本质区别就是:对于外连接的驱动表的记录来说,如果无法在被驱动表中找到
匹配ON子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用
NULL值填充;而内连接的驱动表的记录如果无法在被驱动表中找到匹配ON子句中的过滤条件的记录,那么该记
录会被舍弃。
结
下一节,子查询
浙公网安备 33010602011771号