0

私の質問が最初に来て、次に全体の状況と現在の解決策について説明します。

Questions.
1. Why could mySQL make enormously lots of continous read|write (300-1000 megaBytes) disk operations?
2. Is DB structure optimal (need advice otherwise)?
3. Do UniqueKey could slow down DB?
4. What could be better solution for the situation?
5. At the end vServer is getting down and I got mail with ~'ETIMEDOUT: Connection timed out - connect (2)'; So maybe issue is not in DB structure but it is some misconfiguration?

状況。エンドデバイスのユーザーはゲームをプレイしており、ゲームオーバーになるとゲームの記録を中央の DB に保存します。ユーザーは、ハイスコアでソートされたハイスコア テーブルを確認できます。利用者が多いとは言えません。1分あたり1人のユーザーと仮定しましょう。

解決。ランプ。ユーザーがプレイしている同様のゲームがいくつかあるため、DB にはいくつかの同様のテーブルとビューのペアがあります。(最大 25 テーブル + 合計 25 ビュー)。ほとんどのテーブルには、〜 30 000 レコードが含まれています。そのうちの 3 つには、最大 150,000 レコードが含まれています。

ユーザーを一意に保存するために: 1user-1record 一意のキー UNIQUE INDEX ユーザー ID (ユーザー ID、ゲーム名、ゲームタイプ、レコード値) を作成しました。

ユーザーにはソートされた値 (ハイスコア) が表示されるはずなので、何が必要かを示すテーブルのビューを作成しました。そのため、外部 php スクリプトは、テーブルではなくビューで動作しています。

CREATE TABLE supergameN (
id INT(11) NOT NULL AUTO_INCREMENT,
userid VARCHAR(255) NOT NULL,
username VARCHAR(50) NOT NULL,
gamename VARCHAR(100) NOT NULL,
gametype VARCHAR(100) NOT NULL,
description VARCHAR(100) NULL DEFAULT 'empty',
recordvalue INT(11) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX userid (userid, gamename, gametype, recordvalue)
)

CREATE VIEW supergameN_view AS
SELECT 
    id,
    userid,
    username,
    gamename,
    gametype,
    description,
    recordvalue 
FROM supergameN
ORDER BY gametype, recordvalue DESC

前もって感謝します。アレックス。

4

1 に答える 1

1

解決策ではないかもしれませんが、私が気づいたこと:

recordvalue一意のキーから を除外します。そうしないuserid-gamename-gametype、異なる がある限り、組み合わせごとに複数のレコードが存在できるようになりますrecordvalue

使用することで

UNIQUE INDEX userid (userid, gamename, gametype)

ゲームとユーザーごとに1 つの結果のみを保存するようにします。

そして、さらにいくつかの発言/質問:

  • ゲームを識別するために本当に 2 つの列が必要ですか?
  • 何に保存されdescriptionますか: ユーザーまたはゲームに関連していますか?

gameidおそらく、メイン テーブルに列を 1 つだけ配置し、(説明がゲームに関するものであると仮定して)gamesgameid, gamename,gametypedescription. そしてもちろん、idもう保持する必要はなく、代わりに の組み合わせを(userid,gameid)主キーとして持つことになります。

于 2013-09-03T11:55:34.410 に答える