11 条回复  ·  260 次点击
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 绝大多数情况下,后者可以确保效率至少和前者一样,但是数据库可能会优化,取决于数据量和数据库类型。
sagaxu 初学 2024-9-5 10:20:52

请教 DBA 一个小白问题

第一个问题,数据库一般会自己优化
https://dev.mysql.com/doc/refman/8.4/en/condition-filtering.html

第二个问题,第 2 个查询效率 >= 第 1 个,看 DB 的优化
kosmgco 小成 2024-9-5 10:29:20

请教 DBA 一个小白问题

问题 1: 等值传递,优化器会拆成两个子查询 [from a where id = 10, from b where fid = 10],先 where 再 join 能少很多 io

问题 2:如果 a 数据量比较大,第二种方式左表的数据量会大大减少,会比第一种方式更快,

但是两种方式的结果不一样,第一种方式是先 join 再 order by 再 limit ,最终结果 10 条是确定的,第二种方式结果条数就不一定了
12
返回顶部