• ベストアンサー

問い合わせ結果が得られるまでに時間がかかる?

延べ4000支店×12ヶ月間における商品1と商品2の売り上げを 150ある会社別に合計値を集計するSQL文で、phpMyAdmin経由で 問い合わせ結果が得られるまでに思ったより時間がかかる(体感時間で 2~4分くらい?)のですがそういうものなのでしょうか? ざっくり書くと次のようなもので、 SELECT KAISYACODE, SUM(URIAGE1) AS U1, SUM(URIAGE2) AS U2 FROM MYTABLE GROUP BY KAISYACODE 会社マスター、支店マスター、売り上げテーブルの3つから成り ます。 集計結果イメージ KAISYACODE   U1    U2 ------------------------------- 001   1556,782 343,451 002   2556,989 432,343 003   1456,799 349,213   :(略) 150   3556,980 433,343

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

>ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。 ということは、150*5で750クエリ。 それは多すぎですね^^; SQL文を見直すか、設計を見直すべきでしょう。 下手にSQL発行するよりはPHP側で回したほうが早い場合もあります。

litton101
質問者

お礼

御礼遅くなりました。失礼しました。 やっぱそうですよね・・・ 貴重なコメントありがとうございました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

商品ごとにフィールドを持っているように見えますが これはさすがに非効率かとおもいます。 商品が追加変更されるたびにフィールドを増減させて いてはSQLとしてのデータアクセシビリティも よろしくありません。 それが速度の低下につながっているかどうかは わかりかねますが、通常データの持ち方であれば 以下のような形式の方がよくないでしょうか? 「会社コード,商品コード,売上」のような持ち方 をして、「SELECT `会社コード`,`商品コード`, SUM(`売上`) AS `売上` FROM `MYTABLE` GROUP BY `会社コード`,`商品コード`」 縦会社コード、横商品コードの表にするのは 受け取った側のミドルウェア、たとえばPHPなどで 処理すればよいかと思います

litton101
質問者

お礼

すみません、書き方が悪かったですが、商品ごとに もっているわけではありません。 でも、考え方は大変勉強になりました。 一応、専門業者さんが設計開発したPHP+MySQLシステムなので そのあたりは大丈夫なのですが、取り出す側(わたし) が悪いのだとは思います。 ともかく、貴重なアドバイスありがとうございました。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

時間がかかりすぎのような・・・ データは何件くらい入っているのでしょうか? また、INDEXは使用していますか? ついでに、サーバの性能はどの程度でしょうか? SQL文はシンプルなので、サーバの処理能力の問題も考えられます。

litton101
質問者

お礼

貴重なアドバイスありがとうございました。 データの件数は、会社数マスター150、支店マスター4000、 売り上げテーブル12×4000程度です。 INDEXってMySQL4でつかえるのですか? (とはいえ私はINDEXという用語のみで使い方を知りませんが・・) サーバーは大手電話系会社の月2-3万程度のものです。 ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。

関連するQ&A