当我遇到问题时,我一直致力于构建数据库结构。我有3张桌子A,B,C。表B和C具有1-1的关系,而表A和B具有多的关系。我试图运行以下查询。
SELECT A.id
FROM A
INNER JOIN B ON A.B_id = B.id
INNER JOIN C ON B.id = C.B_id
LIMIT 0,40
查询从未完成,程序在没有响应之前运行了几秒钟。看到这个查询将需要返回数千条记录,我感到非常恼火,它的工作仅限于40条记录。然后我记得索引存在,所以我在所有连接标准上创建了一个索引。我为A.B_id,B.id和C.B_id创建了一个。结果是一个有效的查询。我删除了限制条款后也工作了,所以我继续进行下一个查询。
SELECT A.id
FROM A
INNER JOIN B ON A.B_id = B.id
LEFT OUTER JOIN C ON B.id = C.B_id
LIMIT 0,40
请注意,唯一的区别是第二个连接现在是左外连接。我虽然因为密钥都是一样的,索引仍然应该加速这个。我错了,因为上面的查询已经完成,但速度很慢。我删除了限制条款,查询没有完成。我删除了之前添加的索引,并再次尝试了有限的语句。它在同一时间运行。
问题最终是没有索引,INNER JOIN
根本不起作用,而LEFT OUTER JOIN
只在有限的情况下起作用,尽管它也很慢。使用索引,INNER JOIN
尽快成功完成,但LEFT OUTER JOIN
继续大致相同。
有谁知道加快这个速度的方法?我错过了一个可以提高LEFT OUTER JOIN
性能的索引吗?
根据要求,以下是解释查询计划的输出:
对于两个INNER JOINS:
对于INNER JOIN和OUTER JOIN: