每日一个知识点-小表驱动大表 in 和 exists

发布于:2023-01-09 ⋅ 阅读:(399) ⋅ 点赞:(0)

在这里插入图片描述

每日一题

在这里插入图片描述

小表驱动大表优化

我们在数据库操作时,经常会使用 join 关键字,我们都知道 使用 join过程中要小表驱动大表,那么为什么要这么做呢

我们假设 A 表 有 10000条 数据 B表 有 5 条数据
在使用 join 查询时类似于如下操作

// A join B
for (10000) {
	for (5) {
	}
}

// B join A
for (5) {
	for (10000) {
	}
}

这样可以看出 当A join B 时 需要 10000 次表连接操作 , 而B join A 是 需要 5 次 表连接操作
所以, 小表驱动大表的主要目的是通过减少表连接创建的次数,加快查询速度.

in 和 exists

在使用 in 和 exists 关键字是 他们两个的执行计划是一样的,但是他们的执行机制是不同的 ,如果选择错误就会导致查询过慢

我们同样以上述 A 表 有 10000条 数据 B表 有 5 条数据 为例去展开

select * from A where b_id inselect id from B)

in 的子查询 是先执行 子查询 在执行主查询
上面的sql 操作可以理解为如下

// B join A
for (5) {
	for (10000) {
	}
}
select * from A where existsselect 1 from B where A.b_id = B.id)

exists 是先执行主查询在执行子查询
上面的sql 操作可以理解为如下

// B join A
for (10000) {
	for (5) {
	}
}

总结:
所以 in 的条件建议为小表 , exists 的 后面建议跟大表,也是小表驱动大表的思想,减少表连接的次数提高查询效率