繁体   English   中英

SQL 用一个查询内联多个表

[英]SQL inner join multiple tables with one query

我有一个像下面这样的查询,

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 子句时才会在三个表之间进行内部连接。

Where 子句用作对所有 JOIN 之后出现的数据的过滤器,而如果您对 JOIN 子句本身使用相同的限制,那么它将在避免连接后过滤的意义上进行优化。 也就是说,改为加入过滤后的数据。

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;

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

此外,了解查询的 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;

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

免责声明:您应该使用解释命令来查看执行情况。 我很确定,由于MySql 优化器适用于所有查询,即使我刚刚做的微小更改也可能没有区别

请参阅MySQL 文档:使用 EXPLAIN 优化查询

三个查询比较

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

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

在此处输入图片说明

三问:

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;

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

c:  INDEX(test, test_id, id)  -- `test` must be first
b:  INDEX(r_ID)

这两个都是有用的和“覆盖”的。

另一件事要注意: ba在查询中几乎未使用,因此您不妨这样编写查询:

SELECT c.testID,
    FROM c
    WHERE c.test IS NOT NULL;

那时,您只需要INDEX(test, testID)

我怀疑您通过省略ab一些用法来“简化”您的查询。 好吧,我从那里简化了它,就像优化器应该做的那样。 (但是,消除表格是它不做的优化;它认为这是用户会做的事情。)

另一方面, ba并非完全无用。 JOIN验证在这些表中有相应的行,可能有很多这样的行。 再说一次,我认为你有其他目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM