我有个查询如下,
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子句的情况下,才能在三个表之间进行内部连接。
发布于 2020-02-05 09:06:09
尝试以下几点:
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优化器而没有什么不同。
三次查询比较
看看下面的小提琴: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;发布于 2020-02-05 08:59:04
Where子句在所有联接之后出现的数据上充当筛选器,而如果您使用相同的限制来连接子句本身,那么它将被优化,以避免联接后的筛选。也就是说,使用过滤后的数据进行连接。
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创建索引,以加快查询速度。
另外,学习对查询的解释命令,以获得最佳结果。
发布于 2020-02-11 21:38:20
所有表都应该有一个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验证这些表中是否有相应的行,可能有许多这样的行。再说一次,我觉得你还有别的目的。
https://stackoverflow.com/questions/60070962
复制相似问题