簡體   English   中英

可以使這個SQL查詢更快?

[英]Possible to make this SQL query faster?

只是好奇是否可以更快地進行此查詢? 或者是否有任何其他類似的查詢可以更好地運作?

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

它加速查詢到可用的級別,但有些需要我正在做的事情。

  • 標簽表具有“標簽”和“標識”的唯一索引。
  • 標簽有83K行。
  • Post_tags具有'image_id','tag_id'的唯一索引。 也是每個的正常指數。
  • Post_tags有471K行。
  • 帖子有'id'的唯一索引。 也是'exists'和'ratecount'的正常索引。
  • 帖子表有大約1.1M行。

你的TAG表是什么樣的? 它只包含ID和TAG字段嗎? 我會在TAG(TAG, ID)上創建一個唯一索引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索引POSTS(ID, POSTS, RATEACCOUNT)可以提供幫助,(我知道它是一個冗余索引,並且在INSERT,UPDATE和DELETE上產生額外成本,但它會在這個查詢中幫助你) 。

順便說一下,在內部查詢中使用JOIN可以為您提供性能提升,只需檢查即可。

根據有人建議使用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秒的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM