-1

最も人気のあるゲームに応じて、データベースからゲームの範囲 (たとえば、制限 72、24) を引き出します。ゲーム データを追跡するための別のテーブルと、ゲームの個々の投票を追跡するためのテーブルがあります (1 から 5 までの評価、ゲームごとにユーザーごとに 1 票)。そのゲームのすべての評価投票の平均評価が最も高いゲームは、「最も人気がある」または「より人気がある」と見なされます。5 票未満のゲームは考慮されません。テーブルは次のようになります (「games」と「votes」の 2 つのテーブル)。

games:
gameid(key)
gamename
thumburl

votes:
userid(key)
gameid(key)
rating

さて、「インデックス」と呼ばれるものがあることを理解しました。これは、基本的にテーブルを事前にクエリし、インデックスの別のテーブルを作成することでクエリを高速化できます(よくわかりません..それは私の印象です)。

また、複数のクエリを 1 つの長いクエリ (結合とネストされた select ステートメントを含むと思われます) に凝縮できる場合、mysql が最も高速に動作することも読みました。

ただし、現在インデックスを使用しておらず、最終結果を取得するために複数のクエリを作成しています。

データベースにどのような変更を加える必要がありますか (もしあれば -- インデックス テーブルの作成などを含む)? そして、私のクエリはどのように見えるべきですか?

ありがとうございました。

4

4 に答える 4

1

すべてのゲームの平均を計算するクエリは次のようになります。

SELECT gamename, AVG(rating)
FROM games INNER JOIN votes ON games.gameid = votes.gameid
GROUP BY games.gameid
HAVING COUNT(*)>=5 
ORDER BY avg(rating) DESC
LIMIT 0,25

ゲームと投票の両方で gameid にインデックスが必要です。(ゲーム ID をテーブル ゲームの主キーとして定義している場合は問題ありません)

于 2011-12-11T15:31:07.867 に答える
0

インデックスは、検索タイプのクエリを高速化するために使用される PHYSICAL DATA STRUCTURE です。それは単なるテーブル上のテーブルではありません->しかし、コンセプトには適しています。もう 1 つの概念は、索引が教科書の最後で機能する方法です (唯一の違いは、本では検索キーが複数のページ/一致を指すことができるのに対し、索引では検索キーが 1 つのページ/一致のみを指すことです)。インデックスはデータ構造によって定義されるため、B+ ツリー インデックスを使用でき、ハッシュ インデックスさえあります。これは、データベースの物理/内部レベルからのデータベース/クエリの最適化です。より簡単な DBMS のより高いレベルで作業していることを知っていると思います。インデックスは内部レベル内に根ざしているため、DB クエリの最適化がより効果的で興味深いものになります。

あなたの質問から、まだクエリを開発していないことに気づきました。最初にクエリに焦点を当てます。実際のところ、大学院または大学院のデータベースコースでは、インデックス作成はデータベースの保守に該当し、必ずしも開発ではありません。

また、多くの人が原則としてすべての主キーのインデックスを作成するように言っているのを見てきました。本当じゃない。主キー インデックスがデータベースを遅くする多くのインスタンスがあります。実際、プライマリ インデックスのみを使用する場合は、ハッシュ インデックスを使用する必要があります。ハッシュ インデックスは B+ ツリーよりも優れているからです。

要約すると、クエリとインデックスについて質問することは意味がありません。最初にクエリで助けを求めてください。次に、テーブル (リレーショナル スキーマ) と SQL クエリが与えられた場合にのみ、最適なインデックスについてアドバイスできます。そのメンテナンスを覚えておいてください。開発がゼロだとメンテナンスができません。

敬具、

注意: 多くのコンピューティング コースの大学院レベルでのインデックスに関するほとんどの質問は次のとおりです。学生にリレーショナル スキーマ (つまり、テーブル) とクエリを提供し、次のように質問します。テーブルに対する次のクエリに適したインデックスを批判的に提案します。 ---> 質問がない場合、このような質問はできません

于 2011-12-11T16:47:48.663 に答える
0

MySQLのドキュメントによると、テーブル作成時に主キーを指定するとインデックスが作成されます。すべての RDBMS がこのように機能するわけではないため、これは言及する価値があります。

「投票」テーブルが「ゲーム」と「ユーザー」の間の架け橋として機能し、多対多の関係を処理することで、ここで正しい考えを持っていると思います。「userid」と「gameid」が「votes」テーブルで索引付けされていることを確認してください。

于 2011-12-11T15:29:58.207 に答える
0

テーブルに InnoDB ストレージを使用するアクセス権がある場合は、テーブルの主キー用に作成されたインデックスを使用するテーブルに外部キーを作成できます。次に、これら 2 つのテーブルを結合するクエリ (例: ) を実行すると、そのインデックスを使用して処理が高速化されます。gameidvotesgames... INNER JOIN votes ON games.gameid = votes.gameid

インデックスに関するあなたの理解は基本的に正しいです。つまり、基本的には、クエリの実行時にバックグラウンドで使用できる別のルックアップ テーブルを作成します。

インデックスを使用する場合、EXPLAIN構文を使用すると便利です (単純にSELECTwithを前に付けEXPLAINて試してみてください)。表示される出力には、クエリで使用可能なキーのリストと、クエリが使用しているキーが表示されます。これは、クエリを最適化するときに非常に役立ちます。

于 2011-12-11T15:44:26.080 に答える