多表left join where is null 的优化_鸟枪换大炮sql慢查询优化笔记
时间: 2023-07-06 15:04:34 浏览: 122
在多表 left join 中使用 where is null 可能会导致查询变慢,原因是因为这种写法会在查询时进行全表扫描,而且可能会导致索引失效。为了优化这种情况,可以考虑以下几种方法:
1. 使用 exists 子查询代替 where is null
使用 exists 子查询可以避免全表扫描,因为 exists 子查询只需要找到第一个匹配的记录就可以结束查询。
例如,将下面的查询:
```
SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL;
```
改写成使用 exists 子查询的方式:
```
SELECT *
FROM table1
WHERE NOT EXISTS (
SELECT *
FROM table2
WHERE table1.id = table2.id
);
```
2. 使用 not in 子查询代替 where is null
使用 not in 子查询也可以避免全表扫描,因为 not in 只需要找到第一个不匹配的记录就可以结束查询。
例如,将下面的查询:
```
SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL;
```
改写成使用 not in 子查询的方式:
```
SELECT *
FROM table1
WHERE table1.id NOT IN (
SELECT id
FROM table2
);
```
3. 对表进行优化
如果以上两种方法都无法解决问题,那么可能需要对表进行优化。例如,可以为表添加索引,或者对表进行分区等操作,以提高查询效率。
阅读全文