请教 DBA 一个小白问题

chaleaochexist · 2024-9-5 00:18:12 · 119 次点击
问题 1,

```select a.*,b.*
from a
left join b
on a.id=b.fid
where a.id=10
```
像这种是先 where 还是先 join? 还是数据库会根据它自己的判断进行优化?


问题 2,
```
select a.*,b.*
from a
left join b
on a.id=b.fid
order by a.id
limit 10
```

```
SELECT a1.*, b.*
FROM (
    SELECT *
    FROM a
    ORDER BY a.id
    LIMIT 10
) AS a1
LEFT JOIN b
ON a1.id = b.fid;
```
这两句话是不是执行效率是一样的?

你们在实际工作中遇到类似的场景多吗?
会纠结用哪种 sql 吗?
举报· 119 次点击
登录 注册 站外分享
11 条回复  
Ricebucket 小成 2024-9-5 00:52:37
dba 会管这些?
GeekGao 小成 2024-9-5 01:44:13
使用 EXPLAIN 查看 SQL 查询的执行计划,便知。通常会被自动优化。

假如 a 表 b 表很大,子查询这段 SQL 性能通常高一些,关键因素:LIMIT 。

对 LIMIT 解释:
在单表查询这段 SQL 中,LIMIT 位于 ORDER BY 之后,只取连接后排序后的前 10 条记录。
在子查询那段 SQL 中,LIMIT 位于子查询内部,只取 a 表排序后的前 10 条记录传递给外层查询。
levelworm 初学 2024-9-5 07:48:44

请教 DBA 一个小白问题

Explain 一下就行了。一般优化的都很不错的。
a1b2c3T 初学 2024-9-5 08:48:51

请教 DBA 一个小白问题

问题 1 应该是先 join 再 where
MozzieW 小成 2024-9-5 09:12:56

请教 DBA 一个小白问题

@a1b2c3T 测试加上问 GPT ,至少在我有索引等情况下,会先执行 where 再 join 。下面是 GPT 的解释:

```
理论上:SQL 语句的执行顺序是先 FROM 、再 JOIN 、最后 WHERE 过滤。
实际执行:数据库查询优化器可能会调整顺序,尽量减少数据处理的开销(比如尽可能早地应用 WHERE 过滤条件)。
```
andykuen959595 初学 2024-9-5 09:36:57

请教 DBA 一个小白问题

这种 直接开跑起来 再看 要切合实际环境
qW7bo2FbzbC0 小成 2024-9-5 09:42:16

请教 DBA 一个小白问题

1.按语法来说是 先 join 后 where
2.具体表格具体分析,看 explain 结果
xlzyxxn 小成 2024-9-5 09:56:37

请教 DBA 一个小白问题

mysql 连接查询用的是嵌套循环算法,你这几个 sql 都是左连接或者右连接,驱动表和被驱动表已经确定了;你需要的是为每个表选择成本最低的访问方案;问题 1 问的没太懂,看看嵌套循环执行的步骤你可能就懂了;问题 2 第二种把驱动表缩小到了 10 条记录,扇出次数比第一种要少(在 mysql 没对第一种做优化的时候),效率肯定高,具体执行时 mysql 到底对第一种 sql 做没做优化这个就不清楚了
ZZ74 小成 2024-9-5 10:01:44

请教 DBA 一个小白问题

没特意查过,根据过往经验
A1 先 join ,但是实际性能和你 on on a.id=b.fid and  a.id=10 这样的写法性能是一样的。就是数据库会优化
A2 绝大多数情况下,后者可以确保效率至少和前者一样,但是数据库可能会优化,取决于数据量和数据库类型。
12下一页
返回顶部