【问题标题】:Why does this query use the primary key?为什么这个查询使用主键?
【发布时间】:2016-06-15 16:18:00
【问题描述】:

这些是 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

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

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

【问题讨论】:

  • 这是GROUP BY(也可能是JOIN)。 WHEREs 并不是唯一重要的事情。
  • 当然,不知道为什么我没看到,谢谢!

标签: mysql indexing


【解决方案1】:

我将避免再次说出有关 WP 的选择词。

请为每个表格提供SHOW CREATE TABLE。在没有该信息的情况下,我猜这是缺失的,但需要:

INDEX(post_type, post_status, ID)

“复合”索引中的前两列可以是任意顺序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2011-03-11
    • 2020-03-19
    • 2014-03-12
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多