为什么他们在这个查询中使用左连接并选择元表作为外部表?这样做不是没有效果吗?
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这是我的替代方案,并解释了为什么它比上面的更好:
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发布于 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秒。
https://stackoverflow.com/questions/43931379
复制相似问题