2012-04-16 56 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