0

我在用戶表中有一個巨大的記錄,我想以優化的方式顯示此記錄。我做了一個查詢,但他們需要很多的執行時間(請參閱查詢),我也已經在這兩個表中管理索引,但嚴重失敗(請參閱解釋)。我想使用MySql優化此查詢

我希望每個用戶發帖量就是爲什麼我做了這個查詢是這樣的:

SELECT 
(SELECT COUNT(up.`user_id`) FROM `users_post` up WHERE up.`user_id` = uf.`user_id` 
) AS user_count 
FROM `users` uf; 

Expain enter image description here

+0

對於龐大的數據庫,它可能值得預先計算帖子計數到一個單獨的'users'表列並使用它而不是每次動態計算它 – zerkms

+0

我希望每個用戶的帖子數,爲什麼我這樣做這樣的查詢... @zerkms –

+0

我明白,你需要預先計算數據和商店,如果數據庫很大,你需要經常檢索 – zerkms

回答

3

它看起來像你正在做的是選擇職位的計數每個用戶,爲所有用戶。你並不需要查詢包裝成集從查詢結果,你就應該能夠通過

SELECT user_id, count(*) as totalPosts 
    from user_posts 
    group by user_id 

做到這一點現在,如果你想要更多的用戶信息,與它一起標記,然後你可以加入到用戶表,如:

SELECT users.LastName, users.FirstName, etc, user_id, count(*) as totalPosts 
    from user_posts 
      join users 
       on user_posts.user_id = users.user_id 
    group by user_id 

此外,由zerkms指出,如果這是你要總是爲某種運行總總的東西,我會強烈建議您更新用戶表中有一個「 totalPosts「列作爲整數。然後,每當一個新條目添加到user_posts表,它只是有一個觸發...

更新用戶設置totalPosts = totalPosts +1其中USER_ID =用戶ID使得後

然後,不必總是重新查詢總數。就像S/O中的一些總數一樣,用戶還有其他的總點數,總awr等數據。對於跟隨的標籤,我相信他們也會計算每個標籤有多少個問題。不要過度使用COUNT()將會成爲將來的性能殺手的東西..

+0

刪除我的答案和+1這更全面 – zerkms

+0

PS:不知道它是必需的,但可能是一個小記錄,有時計數器不需要實時實時刷新它們,而不是通過在每次更改時執行增量/減量來進行刷新,但是以批量方式應用更改 – zerkms

+0

@Zerkms,感謝支持和upvote。有時候,只是提供一個查詢來解決一個人的解決方案(我也做了我的分享,特別是在基本查詢上)。然而,幫助新手查詢和更好的結構化,規範化和存儲的聚合物可以幫助他們長期更好地思考他們的問題...... – DRapp