首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个查询的SQL内部连接多个表

一个查询的SQL内部连接多个表
EN

Stack Overflow用户
提问于 2020-02-05 07:33:56
回答 3查看 673关注 0票数 1

我有个查询如下,

代码语言:javascript
运行
复制
SELECT
c.testID,
FROM a
INNER JOIN b ON a.id=b.ID
INNER JOIN c ON b.r_ID=c.id
WHERE c.test IS NOT NULL;

这个查询可以进一步优化吗?我希望只有在满足where子句的情况下,才能在三个表之间进行内部连接。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-05 09:06:09

尝试以下几点:

代码语言:javascript
运行
复制
SELECT
c.testID
FROM c 
INNER JOIN b ON c.test IS NOT NULL AND b.r_ID=c.testID 
INNER JOIN a ON a.id=b.r_ID;

我更改了联接和条件的顺序,以便要计算的第一个语句是c.test IS NOT NULL

免责声明:您应该使用explain命令来查看执行过程。--我非常肯定,即使我刚才做的微小更改,也可能由于适用于所有查询的 MySql优化器而没有什么不同。

MySQL文档:使用EXPLAIN优化查询

三次查询比较

看看下面的小提琴:https://www.db-fiddle.com/f/fXsT8oMzJ1H31FwMHrxR3u/0

我运行了三个不同的查询,最后,MySQL对它们进行了优化并以相同的方式运行。

三个查询:

代码语言:javascript
运行
复制
EXPLAIN SELECT
c.testID
FROM c 
INNER JOIN b ON c.test IS NOT NULL AND b.r_ID=c.testID 
INNER JOIN a ON a.id=b.r_ID;


EXPLAIN SELECT c.testID
FROM a
INNER JOIN b ON a.id = b.r_id
INNER JOIN c ON b.r_ID = c.testID AND c.test IS NOT NULL;

EXPLAIN SELECT
c.testID
FROM a
INNER JOIN b ON a.id=b.r_ID
INNER JOIN c ON b.r_ID=c.testID
WHERE c.test IS NOT NULL;
票数 1
EN

Stack Overflow用户

发布于 2020-02-05 08:59:04

Where子句在所有联接之后出现的数据上充当筛选器,而如果您使用相同的限制来连接子句本身,那么它将被优化,以避免联接后的筛选。也就是说,使用过滤后的数据进行连接。

代码语言:javascript
运行
复制
SELECT c.testID,
FROM a
INNER JOIN b ON a.id = b.ID
INNER JOIN c ON b.r_ID = c.id AND c.test IS NOT NULL;

此外,必须为表test中的列c创建索引,以加快查询速度。

另外,学习对查询的解释命令,以获得最佳结果。

票数 2
EN

Stack Overflow用户

发布于 2020-02-11 21:38:20

所有表都应该有一个PRIMARY KEY。假设id是它所在的表的PRIMARY KEY,那么您需要这些辅助键才能获得最大的性能:

代码语言:javascript
运行
复制
c:  INDEX(test, test_id, id)  -- `test` must be first
b:  INDEX(r_ID)

这两种方法都是有用的,而且是“涵盖”的。

另一件需要注意的事情是:ba在查询中实际上是未使用的,所以您最好以这样的方式编写查询:

代码语言:javascript
运行
复制
SELECT c.testID,
    FROM c
    WHERE c.test IS NOT NULL;

在这一点上,您需要的只是INDEX(test, testID)

我怀疑您省略了ab的一些用法,从而“简化”了查询。嗯,我从那里简化了它,就像优化器应该做的那样。(然而,消除表是一种优化,但它没有做到这一点;它计算出用户应该做的事情。)

另一方面,ba并不是完全无用的。JOIN验证这些表中是否有相应的行,可能有许多这样的行。再说一次,我觉得你还有别的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60070962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档