mysql 语句优化优化

前言

我们都会写很多语句,那么如何让语句看起来更加优美呢?

正文

  1. 移除不必要的括号

((a = 5 AND b = c) OR ((a > c) AND (c < 5)))

=

(a = 5 and b = c) OR (a > c AND c < 5)

  1. 常量传递

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不一定为真

  1. 等值传递

a = b and b = c and c = 5

=

a=5 and b =5 and c = 5

  1. 移除没用的条件

(a < 1 and b = b) OR (a = 6 OR 5 != 5)

= a < 1 OR a = 6

比如b = b 和 5 != 5 一定为true

  1. 表达式计算

a = 5 + 1

a = 6

这个可能优化器自动帮忙优化啥的。

但是下面这种事不会帮忙优化的:

ABS(a) > 5

-a<-8

这样子的。

ABS(a) > 5 可以这样写 a>5 or a<-5 这样,不然不会使用索引。

  1. HAVING子句和WHERE子句的合并

如果查询语句中没有出现诸如 SUM 、 MAX 等等的聚集函数以及 GROUP BY 子句,优化器就把 HAVING 子句和
WHERE 子句合并起来。

  1. 驱动表的选择问题

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子句中的过滤条件的记录,那么该记
录会被舍弃。

下一节,子查询

posted @ 2025-03-21 11:33  敖毛毛  阅读(32)  评论(0)    收藏  举报