[英]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 优化器适用于所有查询,即使我刚刚做的微小更改也可能没有区别。
看看下面的小提琴: 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)
这两个都是有用的和“覆盖”的。
另一件事要注意: b
和a
在查询中几乎未使用,因此您不妨这样编写查询:
SELECT c.testID,
FROM c
WHERE c.test IS NOT NULL;
那时,您只需要INDEX(test, testID)
。
我怀疑您通过省略a
和b
一些用法来“简化”您的查询。 好吧,我从那里简化了它,就像优化器应该做的那样。 (但是,消除表格是它不做的优化;它认为这是用户会做的事情。)
另一方面, b
和a
并非完全无用。 JOIN
验证在这些表中有相应的行,可能有很多这样的行。 再说一次,我认为你有其他目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.