人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLでの集計についての質問です。
データベースはMySQL5.0です。

-id
-quatity
-datetime(DATETIME)

このようなテーブルにレコードが数万から数十万件あります。
ここから、年別(2008)、月別(2008-04)にデータを集計したいのですが、現在以下のようにしています。

SELECT SUM(quantity) FROM TABLE WHERE SUBRSTRING(datetime,1,4) = '2008'
SELECT SUM(quantity) FROM TABLE WHERE SUBRSTRING(datetime,1,7) = '2008-04'

データが増えればそれ相応に処理に時間がかかるのですが、それが遅いのか早いのか分かりません。

そこで質問なのですが、このやり方はオーソドックスなのでしょうか?
年度別、月別の集計において、テーブル設計も含め、何か定石のようなものがあれば教えてください。

●質問者: southgate_01
●カテゴリ:インターネット ウェブ制作
✍キーワード:SELECT SQL オーソドックス データ データベース
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●50ポイント

MySQL4.1 以上では date 関数が使えるので、集計するだけなら、「datetime型のデータから日付別の集計を行う」を参考にしてください。


年別、月別集計が予測されるなら、datetimeを

にフィールド分割しておくといいでしょう。(timeもあるなら適宜分割)

実測していないので確証はありませんが、date関数を使うより速度が向上すると思います。

◎質問者からの返答

アドバイスありがとうございます。

フィールドを分割してやってみようと思います。


2 ● chuken_kenkou
●150ポイント ベストアンサー

日付の範囲検索や日付演算を行う場合、年月を別の列に分けると、検索条件がやや複雑になります。

今回の場合、まず、インデクスの付け方で工夫してみてください。

create index tbl1ix1 on tbl1(`datetime`,`quantity`)

上記のインデクスを定義すれば、データ部をアクセスせず、インデクスだけで結果を得られます。

検索条件は、一般的には日付関数を使います。

select sum(`quantity`) from tbl1 where year(`datetime)=2008;
select sum(`quantity`) from tbl1 where date_format(`datetime`,'%Y-%m')='2008-04';
◎質問者からの返答

アドバイスありがとうございます。

さっそく取り掛かります。


3 ● ken33jp
●50ポイント

2008-1-1<=datetime and datetime <2009-01-01

-------------

該当のSELECT文のdatetimeがインデックスを使用してるかどうかを確認したほうが良いです。

SUBRSTRINGとかいれると、インデックスとして使用できないと思うのでNG。

◎質問者からの返答

アドバイスありがとうございます。

インデックスを利用して最初よりも随分早くなったのですが、こちらの方法もさっそく試してみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ