首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么他们在这个查询中使用左连接并选择元表作为外部表?这样做不是没有效果吗?

问为什么他们在这个查询中使用左连接并选择元表作为外部表?这样做不是没有效果吗?
EN

Stack Overflow用户
提问于 2017-05-12 15:04:43
回答 1查看 113关注 0票数 1

为什么他们在这个查询中使用左连接并选择元表作为外部表?这样做不是没有效果吗?

代码语言:javascript
复制
SELECT meta.meta_value, COUNT( * ) AS meta_value_count
FROM $wpdb->commentmeta meta
LEFT JOIN $wpdb->comments comm ON meta.comment_id = comm.comment_ID
WHERE meta.meta_key = 'rating'
AND comm.comment_post_ID = %d
AND comm.comment_approved = '1'
AND meta.meta_value > 0
GROUP BY meta.meta_value

这是我的替代方案,并解释了为什么它比上面的更好:

代码语言:javascript
复制
SELECT meta.meta_value, COUNT( * ) AS meta_value_count
FROM $wpdb->comments comm /* comments table has better filters it should be outer table */
INNER JOIN $wpdb->commentmeta meta ON (comm.comment_ID = meta.comment_id AND meta.meta_key = 'rating' AND meta.meta_value > 0) /* there is no need to use left join because every commentmeta must has a not null corresponding comment row */
WHERE comm.comment_post_ID = %d /* a better filter to begin with */
AND comm.comment_approved = '1'
GROUP by meta.meta_value
EN

回答 1

Stack Overflow用户

发布于 2017-05-12 23:27:26

我怀疑优化器足够聪明地将左连接转换为内连接,如果它知道转换没有副作用,并且当涉及到内连接时,左表和右表的顺序是可逆的,这就是为什么它可以选择更好的外表来优化查询。

事实上,SQL是一种奇怪的语言。命令之间的区别只是表面上的。在幕后,这可能是一样的。

http://redcrackle.com/blog/how-optimize-drupal-view-so-it-uses-inner-join-instead-left-join

由于这种情况,MySQL认为左连接和内连接是等价的,并有效地将其视为内连接。因此,首先使用field_data_field_user_updated表查找5个最近更新的uids,然后从用户表中加载相应的字段。这一更改将执行时间从大约1秒减少到大约0.13秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43931379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档