2011-06-27 10 views
2

posts_contentという名前のmysqlテーブルがあります。次のようにMysql 'Partitioning'とデータを別のテーブルに分割する

構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `posts_content` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `post_id` int(11) NOT NULL, 
    `forum_id` int(11) NOT NULL, 
    `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=79850 ; 

問題は、テーブルはかなり巨大になっているということです。多くのギガバイトのデータ(Googleにはクロールエンジンがあります)。

データを日常的にテーブルに挿入していますが、データを取得することはめったにありません。テーブルがかなり巨大になっているので、テーブルを扱うのが難しくなります。私たちは、forum_idを使用してテーブルを分割するために、2つの可能性

  1. 使用MySQLのパーティショニング機能を議論し

    (約50 forum_idsがある約50のパーティションが存在することになるので。そう作られている場合でも、各パーティションなおは最終的に成長します再びデータの多くギガバイトは多分最終的に

  2. 独自のドライブを必要とするため、各forum_idごとに1つのテーブルを作成し、そのようなデータを分割します。

私は問題を明確に説明している願っています。私は何知る必要があるのは、上記2つのうちどれが長期的にはよりよい解決策になるかである。アドバイスは何ですか?ディスadv。両方のケースのあなたの違いを

+0

私は質問を受けましたが、あなたが提示した解決策は私には同じですが、MySQLが解決策を提供している場合を除き、ケース2では自分自身を構築するようです。私はそれを正しく持っていますか? –

+0

Ozair Kafray - 相違があり、私が知っているものもあります。たとえば、パーティショニングを使用する場合は以前と同じようにテーブルをクエリし、エンドユーザーには1つのテーブルになりますが、多くのファイルに分割されます。あなたがデータを照会する必要がある場合は、他の方法として、最初にジョインや一時テーブルなどですべてのテーブルを戻す必要があります。あなたが知らない任意の機能を持つ... Darhazerによって投稿されたリンクは面白いです –

答えて

3

に感謝

は、最初のケースでは、あなたがシャーディングを行うためにMySQLをままにしておくことで、第2の場合には、あなたが自分でそれをやっています。 MySQLはデータを含まない断片をスキャンしませんが、クエリWHERE forum_id IN(...)がある場合は、いくつかの断片をスキャンする必要があります。私が覚えている限り、この場合の操作は同期的です。 MySQLは一度に1つのパーティションを照会し、非同期で実装することができます。一般的に、自分でパーティションを作成すると、より柔軟になりますが、forum_idに基づいて単純なパーティショニングを行う場合は、一度に1つのforum_idだけをクエリすると、MySQLのパーティション分割は問題ありません。

私のアドバイスは、パーティション化に関するMySQLのドキュメント、特にrestrictions and limitationsセクションを読んで、決定することです。

+0

これはダムの1つかもしれません。私はmysqlパーティション分割が外部キーをサポートしていないことを読んでいます。上記の表のforum_idに基づいてパーティションを作成できないということですか?そうでない場合は、forum_idに基づいてどのようにパーティション化するのですか?私は、キー、ハッシュなどを理解することはできませんまた、ドキュメントはあなたがサブパーティションで範囲を使用することはできないと言う。データをサブパーティション化できないということですか?または、ハッシュを使用してpost_idにサブパーティション化することはできますか? –

+0

ドキュメントには、外部キーの制約を使用できないと記載されています。これは、値が存在することを保証するために、MySQLが一致する値を探すためにすべてのパーティションを検索する必要があるからです。自分でテーブルをパーティション化すると、パーティション化されたテーブルも参照して外部キーを使用することはできませんが、テーブル自体に外部キーを使用できるようになります。しかし、断片化されたアプリケーションや一般的なNoSQLでは、整合性は主にアプリケーションによって管理され、データベースサーバーでは管理されません。 –

+0

「FOREIGN KEY」は必須ではありません。それらを置き換えるための適切なインデックスを必ず用意してください。 –

0

ここでは、あなたの質問のために良い答えを持っています、https://dba.stackexchange.com/a/24705/15243

基本的には、お使いのシステムは、成長させて、あなたがパーティショニングに慣れますが、お使いのシステムが本当に「バラバラにクロップ」する必要がある場合にそれを行いますパーティショニング。

0

3倍の空間縮小(およびおそらく高速化)のための迅速な解決策は、contentを圧縮してMEDIUMBLOBに入れることです。サーバーではなくクライアントで圧縮を行います。これにより帯域幅が節約され、多くのクライアントサーバー間で計算を分散することができます。

「シャーディング」は、複数のサーバー間でデータを分離しています。 MariaDBとSpiderを参照してください。これにより、サイズの拡大とパフォーマンスのスケーリングが可能になります。シャーディングを終えると、forum_idが最適かもしれません。しかし、これは、フォーラムが大きすぎて1台のサーバーに収まらないと仮定しています。

"パーティション分割"はデータを分割しますが、単一のサーバー内でのみ行います。あなたのユースケースに利点があるとは思われません。 forum_idによるパーティショニングはパフォーマンスを提供しません。

FOREIGN KEYsを削除します。代わりにアプリケーションをデバッグしてください。

関連する問題