[英]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
它加速查詢到可用的級別,但有些需要我正在做的事情。
你的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.