2

MySQL/PHPのパフォーマンスに関連する質問があります。

各レコードに関連付けられたインデックスリストをテーブルに保存する必要があります。各リストには10​​00個のインデックスが含まれています。特定のレコードに関連付けられているリスト内の任意のインデックス値にすばやくアクセスできる必要があります。最善の方法がわかりません。私は次の方法を考えました、そしてそれらについてのあなたの意見をお願いします:

  1. リストをコンマ区切りの値リストとして、またはJSONを使用して文字列に格納します。単一の値を取得するためだけにDBからPHPにリスト全体を抽出する必要があるため、おそらくひどいパフォーマンスです。文字列の解析も正確に高速ではありません...負荷を減らすために、PHP側の最も使用頻度の低いキャッシュに多数の拡張リストを保存できます。

  2. リストとその主キーを格納する1001列のリストテーブルを作成します。これがストレージに関してどれほどの費用がかかるかわかりませんか?これもシステムを悪用しているように感じます。そして、100000個のインデックスを保存する必要がある場合はどうなりますか?

  3. インデックスを含むバイナリファイルの名前のみをSQLで保存し、fopen()を実行します。fseek(); fread(); アクセスごとにfclose()サイクル?システムファイルシステムキャッシュがそれにどのように反応するかわからない。それがうまくいかない場合は、問題に対処するために利用できる多くの解決策があります...しかし、それは少しやり過ぎに聞こえますか?

それについてどう思いますか?

4

3 に答える 3

1

標準的な解決策は、(レコード、インデックス)ごとに1行の別のテーブルを作成し、MySQLインデックスを追加して高速検索を可能にすることです。

CREATE TABLE IF NOT EXISTS `table_list` (
  `IDrecord` int(11) NOT NULL,
  `item` int(11) NOT NULL,
  KEY `IDrecord` (`IDrecord`)
)

必要に応じてのタイプを変更itemします-私intは私の例で使用しました。

于 2013-03-06T13:51:46.250 に答える
1

古き良き1対多の関係はどうですか?

records
-------
id     int
record ...

indices
-------
record_id int
index     varchar

それで:

    SELECT *
      FROM records
 LEFT JOIN indices
        ON records.id = indices.record_id
     WHERE indices.index = 'foo'
于 2013-03-06T13:53:26.940 に答える
0

最も論理的な解決策は、各値を独自のタプルに入れることです。各タプルにMYSQLインデックスを追加すると、DBMSが値をすばやく確認できるようになり、パフォーマンスが向上するはずです。

他の回答を使用しない理由は次のとおりです。

オプション1

1つのMYSQLセルに複数の値を格納することは、データベースの正規化の第1段階に違反します。あなたはここでそれを読むことができます。

オプション3

これは他のファイルに大きく依存しています。将来の保守を容易にするために、データストレージを可能な限りローカライズする必要があります。

于 2013-03-06T13:55:45.447 に答える