【发布时间】:2013-02-07 06:22:57
【问题描述】:
我有两张桌子 ->
-
用户
user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY username VARCHAR(200) NOT NULL -
ping
ping_id INT UNSIGNED NOT NULL AUTO_INCREMENT PPRIMARY KEY disqus_id VARCHAR(32) NOT NULL user_id INT UNSIGNED NOT NULL INDEX combo1(disqus_id,user_id)
我运行这个查询 ->
EXPLAIN SELECT pings.*, username
FROM pings
INNER JOIN users USING(user_id)
WHERE pings.disqus_id = 'post_168' AND user_id = '1'
ORDER BY pings.ping_id DESC LIMIT 2
pimgs 下面的Extracolumn 表示Using where; Using temporary; Using filesort,users 下表示Using where; Using join buffer。
我运行这个查询 ->
EXPLAIN SELECT pings.*, username
FROM pings
LEFT JOIN users USING(user_id)
WHERE pings.disqus_id = 'post_168' AND user_id = '1'
ORDER BY pings.ping_id DESC LIMIT 2
pimgs 下的Extra列显示Using where,而在用户下它是空的。
发生了什么?
【问题讨论】:
-
每个需要多长时间?
-
您意识到
INNER JOIN和LEFT JOIN是不同类型的查询,它们对您的结果集有非常不同的影响。 -
你能详细解释一下@CAbbott
-
@CAbbott:一般来说是这样,但并非在所有特定情况下都是如此。示例 #1:如果您知道每个
ping记录确实有对应的users记录。示例 #2:如果查询中的其他内容过滤掉所有没有users字段的记录。 -
@CAbbott - 你是对的。但是在这种情况下,两个表中的 user_id 都不是 NULL,会有什么不同吗?
标签: mysql left-join inner-join explain