1

ユーザーのために多数のテーブル行を処理する既存の PHP/MySql/JS/Ajax Web アプリを使用しています。現在のページの仕組みは次のとおりです。

  1. ユーザーが大きな csv ファイルをアップロードします。私が取り組んでいるテストには 400,000 行あります (各行には 5 列あります)。
  2. Php は、このデータ用にまったく新しいテーブルを作成し、数十万行を挿入します。
  3. 次に、ページはこのデータを便利な方法でユーザーに並べ替え/処理/表示します。処理には、検索、日付やその他の行による並べ替え、膨大な読み込み時間なしでの再表示が含まれます (JS/Ajax の出番です)。

私の質問は、このアプリがデータをアップロードごとに新しいテーブルに配置するか、ファイルごとに id を持つ 1 つの大きなテーブルに配置する必要があるかということです。元の開発者は、速度を上げるために別のテーブルを追加していたと思います。そのためにはスピードが非常に重要です。

もっと速い方法はありますか?より良いマウストラップはありますか? 誰かがこれに悩まされたことはありますか?

すべての .csv には何十万行も含めることができ、毎日何百もの .csv ファイルをアップロードできることに注意してください。それらは最後に使用されてから約 24 時間後に削除できますが (私は cron ジョブについて何か意見を考えていますか?)

皆さん、ありがとうございました!

コメントに基づくいくつかのメモ:

  • すべてのデータは各ユーザーに固有であり、変更されるため、ユーザーは数時間後にこのデータに再度アクセスすることはありません. 誤ってウィンドウを閉じてすぐに戻ってきた場合にのみ、同じ .csv を実際に再訪問します。
  • 外部キーは必要ありません。すべての csv は各ユーザーに非公開であり、相互参照する必要はありません。
4

2 に答える 2

2

1 日あたり10 5行と 10 2個の CSV があるとすると、1 日あたり 1000 万行になります (そして、そのデータを定期的に消去すると言います)。これはまともなデータベースにとって恐ろしい数字のようには見えません (特に、複数のテーブルではなく、テーブル内でインデックスを作成できることを考えると)。

明らかに、最も頻繁に使用される CSV は、アクセス速度のために非常に簡単にメモリに保持できます。おそらくすべての CSV です (24 時間以上ごとにフラッシュすると、データがほとんどないことに基づく非常に単純な計算で 1Gb の数値が得られます。1Gb は最近では不当な量のメモリではありません)

于 2012-12-07T15:13:24.447 に答える
2

データ構造を変更できないという単純な理由から、すべてのデータを 1 つのテーブルに入れることは避けたいと思います。

とにかくデータは削除されており、異なるロードからのデータを結合する必要がないため、データを 1 つのテーブルに入れる明白な理由はありません。もう 1 つの議論は、アプリケーションが機能するようになったことです。作業が完了した後で、個別のテーブルを意味する何らかの要件を本当に発見したいですか?

単一のテーブルを決定する場合は、テーブルのパーティション分割を使用してください。各ユーザーは独自のデータを使用しているため、パーティションを使用して、各ユーザーの負荷を個別のパーティションに分けることができます。パーティションには制限 (外部キーがないなど) がありますが、これにより、元のデータにアクセスするのと同じくらい速く、単一のテーブル内のデータにアクセスできます。

于 2012-12-07T15:13:32.493 に答える