为什么此查询使用主键?

时间:2016-06-15 16:18:01

标签: mysql indexing

这些是WordPress的帖子表,但这部分不重要。我已从SELECT部分​​删除了一些字段,以使问题更简单。

SELECT  wp_posts.ID, wp_posts.post_title
FROM    wp_posts LEFT JOIN wp_postmeta ON (wp_postmeta.post_id = wp_posts.ID)
WHERE   wp_posts.post_type = 'series'
AND     wp_posts.post_status = 'publish'
GROUP BY wp_posts.ID
LIMIT 100, 100;

EXPLAIN输出

id  select_type table   type    possible_keys       key     key_len ref             rows    Extra
1   SIMPLE  wp_posts    index   type_status_date    PRIMARY 8       NULL             29     Using where
1   SIMPLE  wp_postmeta ref     post_id             post_id 8       db.wp_posts.ID   13     Using index

并非我抱怨,但我想知道为什么在所有WHERE未使用主键时使用主键。即使在wp_postmeta表中有1.5行,此查询也会立即运行。同样有趣的是,只要我添加不是ID的订单,例如ORDER BY wp_posts.post_date DESC,它就需要3秒才能运行。

那么是什么原因导致主键在上面的查询中使用?

1 个答案:

答案 0 :(得分:0)

我将不再再次公布有关WP的选择词。

请为每个表提供SHOW CREATE TABLE。如果没有这些信息,我会猜测这是缺失的,但需要:

INDEX(post_type, post_status, ID)

该组合中的前两列' index可以按任意顺序排列。

我已从SELECT部分​​删除了一些字段,以使问题更简单。 - 您的问题已经失效!现在LEFT JOIN wp_postmeta ON (wp_postmeta.post_id = wp_posts.ID)完全没用,应该删除。