1

ランキングを表示するために使用される Web サイトのテーブルを最適化するために、実際にいくつかの助けを借りることができます。クエリを最適化する方法とインデックスを適切に使用する方法について多くのことを読んできましたが、うまくいくと思った変更を実装した後でも、ほとんど改善が見られません. 私の簡単な解決策は、トップ 100,000 ランキング (毎日更新され、別のテーブルに保存されている) のみを使用して、今のところ速度を向上させることですが、私はそのオプションが本当に好きではありません.

したがって、次のようなユーザーの情報を格納するテーブルがあります。

テーブル「キャッシュ」:

id    (Primary key)
name
region
country
score

ユーザーについては他にも変数が保存されていますが、ランキングでは使用されていないため、ここでは関係ないと思います。

ユーザーが表示できる 3 つの基本的なランキング ページがあります。

世界観:

SELECT cache name,region,country,score FROM cache ORDER BY score DESC LIMIT 0,26

地域ビュー:

SELECT name,region,country,score FROM cache WHERE region='Europe' ORDER BY score DESC LIMIT 0,26

そしてカントリービュー:

SELECT name,region,country,score FROM cache WHERE region='Europe' AND country='Germany' ORDER BY score DESC LIMIT 0,26

データベースの作業を軽減するために考えられるほとんどすべてのインデックスの組み合わせを試しましたが、一部は少し役立つように見えますが、地域と国のクエリの両方で 26 行しか返さないものは見つかりませんでした(単に「スコア」の指標であり、世界ランキングは猛烈な速さです)。

何か基本的なことが欠けているような気がします。どんな助けでも大歓迎です!

追加情報: キャッシュ テーブルは現在、合計 800,000 を少し超える行で、約 920 メガバイトです。さらに情報を使用できる場合は、お知らせください。

4

3 に答える 3

2

スコアがクエリの唯一の基準であるため、世界ランキングはスコアインデックスの恩恵を受けます。ソートされる論理シーケンスは、クエリに組み込まれています。いいですね。

他のクエリは、リージョンのインデックスから恩恵を受けます。ただし、@ Mattが示すのと同様に、地域、国、スコアの複合インデックスが最善の策かもしれません。キーの3つの列は、地域、国、スコアの順序である必要があることに注意してください。

于 2010-08-12T00:40:46.713 に答える
0

何件のレコードについて話しているのですか?

私は SQL の第一人者ではありませんが、この場合、インデックスを変更しただけではうまくいきませんでした。テーブル構造をいじって、どのようなパフォーマンスが得られるかを確認することを検討します。

キャッシュ

id (pk)
LocationId (インデックス)
名前
スコア

位置

LocationId (pk)
CountryId (インデックス) おそらく
RegionId (インデックス) おそらく

CountryId

領域

リージョン ID

位置

LocationId (主キー) CountryId
RegionId

CountryId 名

領域

リージョン ID 名

Procs の一時テーブルを使用すると、あらゆる場合に場所 ID を選択できます。これにより、発生している問題の全体的な複雑さが軽減されます。3 つではなく 1 つのクエリ プランをトラブルシューティングすることになります。

努力は高く、やり遂げるまで見返りが得られるため、最初にインデックスアプローチを検討することをお勧めします.

幸運を

于 2010-08-12T01:13:17.730 に答える
0

国、スコア、地域に 1 つのインデックスを付けます。インデックスが多すぎると速度が低下します。

于 2010-08-12T00:34:12.143 に答える