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 

経由でそれを行うことができることができなければなりませんzerkmsで述べたように、これはあなたが全体の合計を実行しているのいくつかの並べ替えとして常にたいものであれば、私は強く "を持っているユーザーのテーブルを更新することをお勧め、

また
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 

:など、ユーザーテーブルに参加totalPosts "列を整数として返します。新しいエントリがuser_postsテーブルに追加されるたびに続いて、それだけにトリガを持っている...

更新ユーザーは、その後、あなたをUSER_ID =ユーザーIDがポストに

を作るtotalPostsの=のtotalPosts +1を設定します総計を再クエリし続ける必要はありません。ここでS/Oのいくつかの合計と同様に、ユーザーは合計点、合計awrdsなどの他の統計情報を持っています。そして、タグの後ろに、私は彼らもタグあたりの多くの質問の数を持っていると確信しています。将来のパフォーマンスキラーになるものについてCOUNT()を使用しないでください。

+0

私の答えを削除し、より包括的にこれに+1 – zerkms

+0

PS:おそらく、カウンターがリアルタイムで実際にある必要がないことがあるので、それぞれの変更に対して増分/減分を実行するのではなく、一括して変更を適用する必要がある場合があります。 – zerkms

+0

@Zerkms、サポートとupvoteに感謝します。時には、単にクエリを与えるだけで人の解を解決することができます。しかし、初心者の質問やより良い構造化、正規化、および格納された集約が意味を成すことができるのは、彼らの問題をよりよく考えるために長期的な助けになります... – DRapp