2012-04-16 60 views
3

只是好奇,如果有可能让这个查询更快?或者如果有其他类似的查询可以更好地工作?可能使此SQL查询更快?

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 

它加快了查询到可用的水平,但有些需要这个我在做什么。

  • 标签表具有'tag'和'id'的唯一索引。
  • 标签有83K行。
  • Post_tags有'image_id','tag_id'的唯一索引。也正常指数为每个。
  • Post_tags有471K行。
  • 帖子有'id'的唯一索引。 “存在”和“费率计算”也是正常的索引。
  • 邮政表有大约1.1M行。
+0

你的索引是什么? – dfb 2012-04-16 05:32:40

+0

表格帖子和post_tags中有多少数据?你有所有必要的指标吗? – Tobi 2012-04-16 05:34:17

+3

查询计划显示什么?指数是否被实际使用?用正常的连接重写会有什么不同? (有时候规划人员不知道。)表统计信息已更新?无论如何,将所有信息放在原始帖子中。也可以试试DBA。投票结束为“太本地化”。 – 2012-04-16 05:45:58

回答

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 

减少时间从22s> 0.26s。

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(ID, POSTS, RATEACCOUNT)上的唯一索引的POSTS表中可以提供帮助,(我知道这是一个冗余索引,并且在INSERT,UPDATE和DELETE上额外花费,但它会在这个查询中帮助你)。

顺便说一句,在内部查询中使用JOIN可能会提高性能,只需检查它即可。

+0

标签表包含id/tag/tagcount。已经有一个唯一的POST_TAGS索引(IMAGE_ID,TAG_ID)。 – 2012-04-16 06:27:03