2011-12-27 8 views
0

4つの異なるテーブルの情報を取得し、それらをすべて結合するクエリがあります。テーブルは「ギルド」、「ギルド・メンバー」、「フラット」、「ユーザー」です。私の質問にはうまくいきますが、私はそれの効率性とそれがより速くできるかどうか疑問に思っています。MySQLクエリの最適化(COUNTとJOINを使用)

私はそれがうまく動作し、スピードが速いのですが、guilds_membershipsの中にはデータがあまりありません。それは、COUNTED()です。私が使用しているクエリを以下に示します。私は、まあ

SELECT g.id, g.roomid, g.ownerid, g.roomid, g.state, g.name, g.description, g.badgestring, g.primarycolour, g.secondarycolour, g.created, u.username, f.FlatName, COUNT(m.guildid) AS Members 
FROM guilds g 
INNER JOIN users u ON u.id = g.ownerid 
INNER JOIN flats f ON f.FlatID = g.roomid 
INNER JOIN guilds_memberships m ON m.guildid = g.id 
WHERE g.id =1 
LIMIT 0 , 30 

答えて

1

(つまり、NULLをチェックするすべての(理由もなく)で最適化をお手伝いします場合は、常に、ところでguilds_memberships、干潟、およびユーザーの内部で各ギルドのために少なくとも1つのレコードが存在します)このクエリのパフォーマンスを大幅に向上させるために何かできることはないと考えてください。それは大丈夫と思われ、素晴らしいパフォーマンスを示します。

  1. ブレークに部品でこのクエリを:

    しかし、それはあまり大きな実行するために開始した場合、ここで私はどうなるステップがあります。 1つのクエリでギルド情報を取得し、別のクエリでユーザー情報を取得します。アプリケーションコードで結合を行います。

  2. キャッシング可能なものをキャッシュします。 u.usernamef.FlatNameは頻繁に変更されないので、一度ロードしてメモリ(またはmemcached)に保存することができます。

これらの変更の目的は、データベースへの負荷を軽減することです。アプリケーションサーバー(通常は)は規模が小さく、より多くのワーカーを起動できます。一方、データベースは、スケールするのが最も難しいコンポーネントの1つです。

+0

あなたの迅速な答えに感謝します。 u.usernameは決して変わらず、ギルドは交換できず、削除のみが可能です。したがって、ギルドの存在では、u.usernameは常に同じで、f.FlatNameは変更可能ですが、頻繁に変更されることは間違いありません。 私はmemcacheの使用についてあなたが言ったことに気をつけます。将来的には役立つかもしれません。 – DominicEU

関連する問題