1

我在数据库中有两个来自目标网站的表,并且必须获取帖子缩略图行。一个表是wp_posts,另一个是wp_postmeta。标准 Wordpress 导出不包括特色图片,所以我打算自己获取。wp_posts 包含所有帖子,特色图片也是一种帖子并存储在此表中。wp_postmeta 表包含与post id 链接的不同元数据,_thumbnail_id 键的值是post 类型'attachment' 的ID。下面的查询将澄清我想说的一点。

Select * From wp_posts 
Where ID In (Select meta_value 
    From wp_postmeta 
    Where meta_key='_thumbnail_id' 
    And post_id In (Select ID From wp_posts 
        Where post_type='$post_type'));

wp_post 包含大约 10k 行, wp_postmeta 包含大约 70k 行。谢谢大家的帮助。如果你们告诉我如何将带有缩略图的特定帖子类型从一个 wordpress 安装迁移到另一个,那也很棒。

4

1 回答 1

1

我认为嵌套IN子句可能是您的性能问题的根源。您需要一个适度复杂的查询,因为 WordPress 1) 存储您的帖子,其中包含您post_type的一行wp_posts,2) 缩略图“附件”作为另一行wp_posts,以及 3) 附件元数据wp_postmeta。我相信这就是为什么你使用嵌套IN的 s but INs 并不是特别有效的原因。

您的查询确实有效,但是对于您的大小的数据库,您可能会耗尽内存或时间,或两者兼而有之。在我的数据库上,它要小得多,您的查询在 0.0123 秒内执行。以下查询与您的查询结果完全相同,执行时间为 0.0006 秒。

SELECT children.*
FROM wp_posts as children
JOIN wp_posts as parents on parents.ID = children.post_parent
WHERE children.ID IN (
    SELECT meta_value
    FROM wp_postmeta
    WHERE post_id = parents.ID
    AND meta_key='_thumbnail_id'
) 
AND parents.post_type='{$post_type}'

鉴于它从我的数据库返回 4 行,您可以看到这是多么巨大的执行差异。

以下查询并不比上面的查询慢多少(0.0013 秒),但返回前一个查询未返回的行(在我的情况下是额外的),并且仍然比您的快很多倍。我认为这是您想要的查询。

SELECT *
FROM wp_posts as children
JOIN wp_posts as parents on parents.ID = children.post_parent
JOIN wp_postmeta ON parents.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = '_thumbnail_id'
AND children.post_type = 'attachment'
AND parents.post_type = '{$post_type}'
于 2012-12-23T18:11:59.653 回答