- ベストアンサー
データを西暦ごとにテーブルに分ける方法を教えてください
- テーブルtableには30万件ほどのデータがありますが、1年ごとにテーブルを分割したいです。
- 現在のデータ量の多さから、phpmyadminを使用する方法では難しいです。
- 効果的な分割方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>現在、SELECT文での絞り込みに数十秒かかります。 適切なインデックスが生成されていれば、それほどは時間が掛からないはず。 副問い合わせ等を過剰に使われているのではないでしょうか?例えば、1件の読み込み毎にすべてのデータを読み込んでいたり。 http://gihyo.jp/dev/serial/01/sql_lifesaving/0001 http://www.geocities.jp/mickindex/database/db_optimize.html 読み込み時間の短縮のチューニングは数ありますが、読み込みのSQL自体に問題があることが多いです。具体的な読み込みSQLがわからないのでココでは割愛します。 テーブル分割は避けたほうが無難です。 select結果のinsertは↓ 1年ずつ実行するのが確実。 http://www.ksknet.net/postgresql/selectinsert.html
その他の回答 (2)
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
プログラムを作らないと、SQLだけでは難しい思います。 私の作ったツールの場合で恐縮ですが、簡単に出来ますので、よろしければお試し下さい。 注意:ツールはデータベース名(スキーマ名)がMySQLに接続されますので、テーブル名に陽にデータベース名(スキーマ名)を指定する必要があります、プログラム例は作業用データベース(_W)上にあるテーブルを使っています。 プログラム例: 100 PROGRAM=NOT 200 DATA=YES{3}{YES,NO} 300 =IF{_DATA!='YES'}EXIT{}; 400 =SET{W_TBL=_W+'_TABLE'}; 500 =SQL1{SELECT DISTINCT YEAR FROM ?W_TBL?}; 600 =LOOP:SQL1_NEXT{W_YEAR}EXIT{}; 700 =COPY_TABLE{?W_TBL??W_YEAR?}{?W_TBL?}{WHERE YEAR=?W_YEAR?}; 800 =BACK{LOOP};
- notnot
- ベストアンサー率47% (4900/10358)
何が問題なのかわかりませんが、GUIのツールは使えるが、SQLを知らないので書けないということでしょうか? そもそも、そういう事をしたいというのは何故でしょう?問題設定がおかしい気がします。
お礼
>GUIのツールは使えるが、SQLを知らないので書けないということでしょうか? 簡単なSQLなら使えますが、複数のテーブルに複数条件を適用するような複雑なSQL文はまだ使うことができないため、質問させていただきました。 >そもそも、そういう事をしたいというのは何故でしょう? 現在、SELECT文での絞り込みに数十秒かかります。 単純にテーブルのデータ量が多いのが原因なので、西暦ごとに分割しようと判断した次第です。
お礼
最初はPHPで分岐条件をプログラムしようとも思ったのですが、量が多いため処理に不安があります。 SQL単体ではなく、やはりプログラムを構築しなければいけませんか。 教えていただいたコードはI言語のようですが、I言語でしたらこの量の処理も可能でしょうか。