データを西暦ごとにテーブルに分ける方法を教えてください

このQ&Aのポイント
  • テーブルtableには30万件ほどのデータがありますが、1年ごとにテーブルを分割したいです。
  • 現在のデータ量の多さから、phpmyadminを使用する方法では難しいです。
  • 効果的な分割方法を教えてください。
回答を見る
  • ベストアンサー

データを西暦ごとにテーブルに分けたい

30万件ほどデータがあるテーブルtableがあります。 フィールドyearにそのデータが作成された西暦が4桁のint型で記されているのですが、 これを1年ごとに分割してテーブルを生成したいです。 ---------- table (id はオートインクリメント) id name year info 1 aaaa 2011 aaaaaaaa   2 bbbb 2012 bbbbbbbb 3 cccc 2010 ccccccc 4 dddd 2012  dddddddd 5 eeee 2011  eeeeeee : : ↓ table2010 id name year info 1 cccc 2010 ccccccc : : table2011 id name year info 1 aaaa 2011 aaaaaaaa 2 eeee 2011  eeeeeee : : table2012 id name year info 1 bbbb 2012 bbbbbbbb 2 dddd 2012  dddddddd : : ------------ データが数十件ならphpmyadminを駆使するのですが、今回はデータ量が多いこともあり、 これらを上手に分ける方法となると現在の私の力では難しいです。 このような形でテーブルを分割する方法を教えてください。 よろしくお願いします。

  • MySQL
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.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)

回答No.2

プログラムを作らないと、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};

spinia0120
質問者

お礼

最初はPHPで分岐条件をプログラムしようとも思ったのですが、量が多いため処理に不安があります。 SQL単体ではなく、やはりプログラムを構築しなければいけませんか。 教えていただいたコードはI言語のようですが、I言語でしたらこの量の処理も可能でしょうか。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

何が問題なのかわかりませんが、GUIのツールは使えるが、SQLを知らないので書けないということでしょうか? そもそも、そういう事をしたいというのは何故でしょう?問題設定がおかしい気がします。

spinia0120
質問者

お礼

>GUIのツールは使えるが、SQLを知らないので書けないということでしょうか? 簡単なSQLなら使えますが、複数のテーブルに複数条件を適用するような複雑なSQL文はまだ使うことができないため、質問させていただきました。 >そもそも、そういう事をしたいというのは何故でしょう? 現在、SELECT文での絞り込みに数十秒かかります。 単純にテーブルのデータ量が多いのが原因なので、西暦ごとに分割しようと判断した次第です。

関連するQ&A

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • SQLでの集計

    下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID  item ---------------------------------- 1   AAAA 2   BBBB 3   CCCC 4   DDDD 5   EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID  item  buy1  buy3  buy4  buy5  buy6・・・・ ---------------------------------- 1  AAAA CCCC BBBB DDDD EEEE 2  BBBB DDDD AAAA 3  CCCC AAAA EEEE DDDD KKKKK 4  DDDD AAAA BBBB CCCC EEEE 5  EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。

  • ACCESSにて2つのテーブルの比較

    2つのテーブルA,テーブルBがあります。テーブルBのデータ以外のデータを選ぶにはどうのようにすれば良いのでしょうか? テーブルA data--- aaaa bbbb cccc dddd aaaa cccc テーブルB data--- aaaa bbbb 欲しい結果 テーブルA data--- cccc dddd cccc よろしくお願い致します。

  • Access Union について

    下記2テーブルがあります。 テーブル1 品番   1月合計 AAAA   1111 BBBB   2222 CCCC   1122 EEEE   3211 テーブル2 品番   2月合計 AAAA   1211 BBBB   3222 CCCC   1522 DDDD   2223 UNIONのSQL文で下記のような結果を得たいです。 品番   1月合計  2月合計 AAAA   1111    1211 BBBB   2222    3222 CCCC   1122    1522 DDDD         2223 EEEE   3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。

  • mysqlについて

    いつもお世話になっております。 またまたmysqlについて質問させていただきます。 下記のようなテーブルがあります。 tabel A | type_id | member_id | date| | 2 | 45| 2012-6-21 | | 2 | 46| 2012-6-22 | | 2 | 47| 2012-6-19 | | 2 | 48| 2012-6-10 | | 4 | 49| 2012-5-23 | | 4 | 50| 2012-5-24 | | 4 | 51| 2012-5-21 | | 4 | 52| 2012-5-22 | | 3 | 53| 2012-7-25 | | 3 | 54| 2012-7-26 | | 3 | 56| 2012-7-23 | | 3 | 57| 2012-7-24 | | 1 | 58| 2012-8-17 | | 1 | 59| 2012-8-18 | | 1 | 60| 2012-8-25 | | 1 | 61| 2012-8-26 | table B | type_id | name | | 1 | aaaa | | 2 | bbbb | | 3 | cccc | | 4 | dddd | 下記の条件で値を取得するSQLをご教授いただけますでしょうか 1.type_idでまとめたものを3件ずつ取得   (三件の中で一番直近のdateを持っているもの順にtype_idを並べる) 2.type_idのまとめた三件がdateの直近順 3.type_idのそれぞれのnameをくっつける 結果として | type_id | member_id | date|name | 4 | 51| 2012-5-21 |dddd | 4 | 49| 2012-5-23 |dddd | 4 | 50| 2012-5-24 |dddd | 2 | 48| 2012-6-10 |bbbb | 2 | 47| 2012-6-19 |bbbb | 2 | 45| 2012-6-21 |bbbb | 3 | 56| 2012-7-23 |cccc | 3 | 57| 2012-7-24 |cccc | 3 | 53| 2012-7-25 |cccc | 1 | 58| 2012-8-17 |aaaa | 1 | 59| 2012-8-18 |aaaa | 1 | 60| 2012-8-25 |aaaa 説明が下手ですみません…分かりにくければ補足説明いたします…

    • ベストアンサー
    • MySQL
  • access で 方法を教えてください。

    access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例)  1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例)  抽出条件    ↓   aaaa 2件 2500byte   bbbb 2件 5000byte  cccc 2件 5000byte   dddd 2件 2120byte   eeee 1件 2000byte   ffff 3件 5120byte 宜しくお願いします。

  • UNIXで文字列分割

    UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。

  • [Excel]重複データの一方のセルが持つ値を一方の空白セルに反映させたい

    A列にある7000件ほどのデータの中から重複データのみを抽出し、 重複データの一方がB列に持つ値を、もう一方のデータのB列の空白セルに反映させたいのですが、方法はありますでしょうか? 「COUNTIF」を使って重複データの抽出はできますが、一方が持つデータをもう一方の空白に反映させることができません。 手作業では期限に間に合わない可能性がみえて焦っております。 恐縮ですがご教授いただけますでしょうか。 (例) [処理前] A列:B列:C列 1111:AAAA:aaaa 2222:BBBB:bbbb 3333:CCCC:cccc 1111:    :dddd 2222:    :eeee [処理後] A列:B列 1111:AAAA:aaaa 1111:AAAA:dddd 2222:BBBB:bbbb 2222:BBBB:eeee

  • エクセルで教えて下さい。

    エクセルで教えて下さい。 オートフィルタ、ピボットテーブル以外で関数などで教えて下さい。 A列に大量の文字列があり重複したりしてます。 そこで、 B列にはA列にある大量の文字列を重複なしで表示させたいと思ってます。 例えば A列 B列 AAAA AAAA BBBB BBBB AAAA CCCC CCCC DDDD DDDD EEEE DDDD FFFF EEEE FFFF EEEE AAAA みたいな感じです。A列は編集可能でQQQQを追加すれば自動でB列にも表示させたいです。 このようなことを簡単にできますでしょうか? 宜しくお願いします。

  • Excel抽出のマクロかVBAを教えてください

    A列にxxxがあった場合、その上に存在するIDの値を抽出する方法を教えていただけますでしょうか? 例)xxxがあった場合、IDの値を抽出したい。 以下の場合、ID:1111とID:3333と表示したい。 (ID以降の値はランダムです) A列 ID:1111 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff ID:2222 aaaa bbbb cccc dddd eeee ffffff ID:3333 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff