gpt4 book ai didi

mysql - Left JOIN 更快还是 Inner Join 更快?

转载 作者:IT老高 更新时间:2023-10-29 00:21:15 24 4
gpt4 key购买 nike

所以...哪个更快(NULl 值不是问题),并且已编入索引。

SELECT * FROM A
JOIN B b ON b.id = a.id
JOIN C c ON c.id = b.id
WHERE A.id = '12345'

使用左连接:

SELECT * FROM A
LEFT JOIN B ON B.id=A.bid
LEFT JOIN C ON C.id=B.cid
WHERE A.id = '12345'

这是实际的查询在这里..都返回相同的结果

Query (0.2693sec) :
EXPLAIN EXTENDED SELECT *
FROM friend_events, zcms_users, user_events,
EVENTS WHERE friend_events.userid = '13006'
AND friend_events.state =0
AND UNIX_TIMESTAMP( friend_events.t ) >=1258923485
AND friend_events.xid = user_events.id
AND user_events.eid = events.eid
AND events.active =1
AND zcms_users.id = user_events.userid

EXPLAIN

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE zcms_users ALL PRIMARY NULL NULL NULL 43082
1 SIMPLE user_events ref PRIMARY,eid,userid userid 4 zcms_users.id 1
1 SIMPLE events eq_ref PRIMARY,active PRIMARY4 user_events.eid 1 Using where
1 SIMPLE friend_events eq_ref PRIMARY PRIMARY 8 user_events.id,const 1 Using where



LEFTJOIN QUERY: (0.0393 sec)

EXPLAIN EXTENDED SELECT *
FROM `friend_events`
LEFT JOIN `user_events` ON user_events.id = friend_events.xid
LEFT JOIN `events` ON user_events.eid = events.eid
LEFT JOIN `zcms_users` ON user_events.userid = zcms_users.id
WHERE (
events.active =1
)
AND (
friend_events.userid = '13006'
)
AND (
friend_events.state =0
)
AND (
UNIX_TIMESTAMP( friend_events.t ) >=1258923485
)


EXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE friend_events ALL PRIMARY NULL NULL NULL 53113 Using where
1 SIMPLE user_events eq_ref PRIMARY,eid PRIMARY 4 friend_events.xid 1 Using where
1 SIMPLE zcms_users eq_ref PRIMARY PRIMARY 4 user_events.userid 1
1 SIMPLE events eq_ref PRIMARY,active PRIMARY 4 user_events.eid 1 Using where

最佳答案

视情况而定;运行它们以找出答案;然后运行“解释选择”以获得解释。

实际性能差异可能从“几乎不存在”到“非常显着”,具体取决于 A 中 id='12345' 的行中有多少行在 B 和 C 中没有匹配记录。

更新(基于发布的查询计划)

当您使用 INNER JOIN 时,从哪个表开始并不重要(结果方面,而不是性能方面),因此优化器会尝试选择它认为性能最佳的表。似乎您在所有适当的 PK/FK 列上都有索引,并且您在 friend_events.userid 上没有索引,或者 userid = '13006' 的记录太多> 它没有被使用;无论哪种方式,优化器都会选择行数较少的表作为“基础”——在本例中为 zcms_users

当您使用 LEFT JOIN 时,从哪个表开始确实很重要(就结果而言);因此选择了 friend_events。现在为什么我不太确定这样花费的时间更少;我猜 friend_events.userid 条件有帮助。如果你要在上面添加一个索引(顺便说一句,它真的是 varchar 吗?不是数字?),你的 INNER JOIN 的行为也可能会有所不同(并且变得更快)。

关于mysql - Left JOIN 更快还是 Inner Join 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com