3

只是好奇是否有可能使这个查询更快?或者是否有任何其他类似的查询会更好?

SELECT id,source FROM posts
WHERE id = ANY(SELECT image_id FROM `post_tags` WHERE tag_id = (SELECT id FROM `tags` WHERE tag = _utf8 '$TAG' collate utf8_bin))
  AND posts.exists = 'n'
ORDER BY posts.ratecount DESC
LIMIT 0,100

不使用:

  AND posts.exists = 'n'
ORDER BY posts.ratecount
DESC LIMIT 0,100

它可以加快查询到可用级别,但对于我正在做的事情有点需要这个。

  • Tags 表具有“tag”和“id”的唯一索引。
  • 标签有 83K 行。
  • Post_tags 具有“image_id”、“tag_id”的唯一索引。也是每个的正常索引。
  • Post_tags 有 471K 行。
  • 帖子具有“id”的唯一索引。'exists' 和 'ratecount' 的正常索引也是如此。
  • Posts 表有大约 110 万行。
4

2 回答 2

0

你的 TAG 表是什么样子的?它是否仅包含 ID 和 TAG 字段?我会创建一个唯一索引,TAG(TAG, ID)因此最里面的查询只是搜索索引。

POST_TAGS 表呢?它只是 TAG_ID 和 IMAGE_ID 的组合吗?同样,我会在POST_TAGS(IMAGE_ID, TAG_ID).

请注意,索引中字段的顺序很重要,并且索引与解析计划中使用POST_TAGS(TAG_ID, IMAGE_ID)的索引有很大不同。POST_TAGS(IMAGE_ID, TAG_ID)

并且在 POSTS 表中具有唯一索引POSTS(ID, POSTS, RATEACCOUNT)会有所帮助(我知道它是一个冗余索引,并且会在 INSERT、UPDATE 和 DELETE 上产生额外的成本,但它会在此查询中为您提供帮助)。

顺便说一句,在内部查询中使用 JOIN 可能会给您带来性能提升,只需检查一下。

于 2012-04-16T06:22:13.367 回答
0

正如有人建议的那样,设法使用 JOIN 使其工作。

SELECT * FROM posts
LEFT JOIN post_tags ON post_tags.image_id = posts.id
JOIN tags ON post_tags.tag_id = tags.id
WHERE tags.tag = _utf8 '$tag' collate utf8_bin
  AND posts.exists = 'n'
ORDER BY posts.ratecount DESC
LIMIT 0,100

所需时间从 22 秒 > 0.26 秒减少。

于 2012-04-16T20:30:41.683 回答