mysql - WHERE 子句后跟 JOIN

标签 mysql sql join where-clause

我有一个非常大的值表。我们称该表为。我有一个较小的表,称为 small。我想加入这些表,但仅限于 big 内的特定值。

我可以通过说来获取值

SELECT a,b FROM big WHERE foo='bar';

我想用 small 加入那个结果,说这样的话:

SELECT a,b FROM big WHERE foo='bar' 
LEFT JOIN (SELECT b as small_b,c,d FROM small) ON big.b=small.small_b

我不想把所有东西都放在 big 中,因为那是很多东西并且需要半分钟。我只需要那个小子集。我该怎么做呢?

编辑:我已经编辑了我的查询以匹配末尾的 WHERE 子句。尽管我将其中一个表称为,但它实际上只有不到 500,000 行。我使用的测试用例查询没有使用在 big 中找到的任何值(big 在 foo='bar' 处没有值),并且查询仍然花费了 7 秒多的时间。这真的很正常吗?这对我来说似乎非常慢。

最佳答案

我认为您将 SQL 的语法误认为是 RDBMS 引擎执行的执行流程:这个查询

SELECT a,b FROM big b
LEFT JOIN (SELECT b as small_b,c,d FROM small) ON big.b=small.small_b
WHERE b.foo='bar'

将被优化为仅对 foo='bar' 条件过滤的 big 的行执行连接,而不是对整个 big,尽管 WHERE 子句以文本形式出现在 JOIN 之后,但任何值得一提的查询优化器。

你可能想在没有内部 SELECT 的情况下重写它,如下所示:

SELECT t1.a as big_a, t1.b as big_b, t2.b as small_b, t2.c, t2.d
FROM big t1
LEFT JOIN small t2 ON t1.b = t2.b
WHERE t1.foo='bar'

关于mysql - WHERE 子句后跟 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000389/

相关文章:

sql-server - 如何在 TSQL 中将一个表中的行均匀分布到另一个表中的行?

java - 调用 CRUD 时检查 "parent"是否存在并读取或连接?

php - 函数多次只返回一个值

javascript - 如何将套接字信息自动添加到MySQL

sql - Play框架忽略进化脚本

sql - 使用虚拟默认列取 SQL 平均值

mysql - 在一个巨大的 MySQL 生产表上创建一个没有表锁定的索引

php - 删除mysql中的行并从文件夹关联

php - 使用 php 查询选择所有订单

MySQL 不区分大小写的连接