1

MySQL データベースに 2000 万のレコード テーブルがあります。適切なインデックスを設定したため、SELECT は非常に高速に動作しますが、INSERT および UPDATE 操作は非常に遅くなります。データベースは、負荷の高い Web アプリケーションのバックエンドです。このテーブルには 5 つのインデックスがあり、現在のインデックス サイズは約 1GB であるため、INSERT と UPDATE は非常に低速です。計算に時間がかかると思います。

この問題を解決するために、テーブルを分割することにしました。私は MySQL 4 を実行しており、アップグレードできません (サーバーを直接制御できない) ため、手動でパーティショニングを行い、セクションごとに個別のテーブルを作成します。

データセットは、約 18000 の異なる論理スライスから構成されており、完全に個別にクエリを実行できます。したがって、(maindata1、maindata2 など) という名前の 18000 個のテーブルを作成できました。しかし、これが最適な方法であるかどうかはわかりませんか?手動で何かをしたいときはいつでも、管理ツールで 18000 項目をブラウズしなければならないという明らかな事実に加えて、ファイル システムのパフォーマンスが心配です。ファイルシステムはext3です。36000 個のファイル (データ ファイルとインデックス ファイルがあります) を含むディレクトリ内のファイルを見つけるのがどれほど速いかはわかりません。

これが問題になる場合は、データの一部を結合して同じテーブルにすることができます。例: maindata10、maindata20 など。maindata10 にはスライス 1、2、3...10 が含まれます。10 の「グループ」を使用する場合、テーブルは 1800 しかありません。20 個をグループ化すると、900 個のテーブルが得られます。

このグループ化の最適なサイズ、つまりディレクトリ内のファイルの数とテーブルのサイズはどうなるのだろうか?

編集:複数の別々のデータベースを使用してファイルをグループ化することも良い考えではないかと思います. したがって、18000 個のテーブルがあったとしても、それらを 600 個のテーブルを持つ 30 個のデータベースにグループ化できます。これでだいぶ管理しやすくなりそうです。複数のデータベースを使用することで、パフォーマンスやメモリ フットプリントが増減するかどうかはわかりません (ただし、バックアップと復元が複雑になります)。

4

2 に答える 2

1

パフォーマンスを向上させるために従うことができるいくつかの戦術があります。「パーティション」とは、「列のレイアウトは同じだがデータの内容が異なるテーブルのバージョン」を意味すると思います。

可能であれば、mySQL 5 を実行するサーバーを入手してください。アップグレード後に問題が発生しないように、この点で十分に高速で優れています。

InnoDB を使用していますか? もしそうなら、myISAM に切り替えてもらえますか? (厳格なトランザクションの整合性が必要な場合は、切り替えることができない場合があります)。

パーティショニングでは、どのような種類のデータ スライスの組み合わせで (行数で) ほぼ同じサイズのパーティションが得られるかを把握しようとする場合があります。もし私があなたなら、あなたがその必要性を自分自身で証明できない限り、約 20 個以下のパーティションを選びます。

一部のデータ スライスのみがアクティブに更新されている場合 (たとえば、それらが「今月のデータ」と「先月のデータ」の場合)、それらを小さなスライスに分割することを検討します。たとえば、「今週のデータ」があるとします。 "、"先週"、"前の週" をそれぞれのパーティションに分けます。次に、パーティションが冷えたら、それらのデータをコピーして、"前々四半期" のような大きなグループにまとめます。これには、次のような欠点があります。定期的な日曜の夜スタイルのメンテナンス ジョブを実行する必要がありますが、ほとんどまたはすべての更新がテーブルのごく一部でしか行われないという利点があります。

于 2010-09-06T16:11:33.273 に答える
1

myISAM を使用している場合は、マージ エンジンを調べる必要があります。この方法では、mysql5 のパーティショニングとほぼ同じ機能を得ることができ、現在実行しているものと同じ選択を実行できます。

于 2011-07-26T22:01:03.520 に答える