2012-03-13 10 views
1

私は、共有ホスティングサーバー上で通行料を払っている約50万行の大きなテーブルを持っています。私はこの大きなテーブルを共有ホスティング環境で他のオプションがないので、3〜4個の小さなテーブルに分割することになっています。分割している間は、大きなテーブルをそのまま保ち、大量のテキストを含む特定の列のみを取り出し、小さなテーブルに分割します。 私が今探していますが、私はPHPコードに最小限の変更を行う必要があり、次のようにテーブルには、いくつかのものに分割されることができるソリューションです。1つの列と別のテーブルの列を指す

main_table

id | column1 | column2 | column3_just_pointer 

smaller_table_1

id | main_table_id | column3 

smaller_table_2

id | main_table_id | column3 

小さいです_table_3

id | main_table_id | column3 

MySQLがSELECTコマンドを実行する上でより小さなテーブルにCOLUMN3を指すことができるポインタのようなものがある場合:選択ID、main_tableからcolumn3_just_pointerを、Iは、上述した様式とフロントエンドPHPコードでテーブルを分割することができ編集する必要は全くありません。 私は明らかに響きたいと思います。これを実現できるかどうか、どのように達成するかについては、ここにいる人がいますか?ありがとうございます...

注:複数の小さなテーブルを作成できないため、ビューを使用することはできません。

答えて

0

small_table_1、small_table_2などの名前でテーブルを完全に水平に分割し、各テーブルの開始IDと終了IDを 'main_table'という別のテーブルに記録しました。新しいデータは最後のテーブルにのみ追加され、テーブルが40000行を横切ると、アプリケーションは自動的に新しいテーブルsmall_table_nを作成し、その新しいテーブルの情報をmain_tableに入れます。

この質問は、3月と7月まで、私のウェブサイトの3つで完璧に働いていました。私の3人のホストもすべて自分のサーバー上でより多くのリソースを占有していません。

0

垂直パーティショニングを行う場合、関連するすべてのテーブルをマージするビューを作成することができます。そのため、アプリケーションは基礎となるテーブルをまったく知る必要はありません。例えば 、

TABLE main_table(id -PK, column list); 
TABLE detail1 (main_id - PK,FK to main_table, column list); 
TABLE detail2 (main_id - PK,FK to main_table, column list); 

CREATE VIEW main_view AS 
SELECT a.id, [columns from main_table], [columns from detail1, detail2, etc] 
FROM maint_table a 
LEFT JOIN detail1 b ON (b.main_id = a.id) 
LEFT JOIN detail2 c ON (c.main_id = a.id) 

は今、すべてのアプリケーションselect sがmain_viewに対して行うことができます。

+0

しかし、私がビューを使用する場合、私がメインテーブルから取り出したカラムを複数のテーブルに分割することができないという問題があります。私はちょうどsmall_table_1を作成し、その特定のテーブルのすべての50万行を置くことができます...あなたの返信をありがとう... – Vishnu

関連する問題