性格いい人が優勝

■データベース
os:linux
mysql
バージョン:5.1.73
ストレージエンジン:myisam
Aテーブル:indexあり レコード件数:10,000,000件

■webサーバー
os:linux
開発システム:php

<概要>
linux環境で集計phpにてAテーブルを作成します。
windows環境でAテーブルの内容を閲覧phpにて表示させます。


現象を下記に記述します。

・linux環境
1.DB上のAテーブルが毎朝の更新処理で作成(更新)されます。(9時30分頃完了)
  ※作成処理はこれで完了です。翌朝まで処理は起動しません。

・windows環境
2.9時30分から11時59分59秒の間にAテーブルでselect文を発行
3.3秒程でselectされた内容が表示されます。(この内容はキャッシュされます。)
4.この後、未キャッシュのselect文を9時30分から11時59分59秒の間に何度発行しても
  3秒程でselectされた内容が表示されます。(この内容もキャッシュされます。)
5.この後、12時00分00秒にAテーブルで同じselect文を発行
6.3秒程で表示されていたものが、5分程の時間を要して表示されます。
  ※index使用せず、テーブルフルスキャンしていると思われます。
  (この内容もキャッシュされます。)
7.この後は、未キャッシュのselect文を12時00分00秒から14時59分59秒の間に何度発行しても
  3秒程でselectされた内容が表示されます。(この内容もキャッシュされます。)
8.この後、15時00分00秒にAテーブルで同じselect文を発行
9.3秒程で表示されていたものが、又5分程の時間を要して表示されます。
  ※これもindex使用せず、テーブルフルスキャンしている。(この内容もキャッシュされます。)
10.その後は、18時00分00秒、21時00分00秒と3時間間隔で同現象となります。

要望としまして
上記の3時間間隔でフルスキャンしてしまう現象を止めたいと思っています。

my.cnfの内容、phpに組み込まれている内容など調べてみたのですが、
時間によってフルスキャンしてしまう(index使用しない)設定がみつかりませんでした。

オプティマイザの挙動(統計情報も関わっている?)についても調べたのですが
上記現象に繋がる情報を取得出来ませんでした。

この現象を解決していただける方、どうかご教示お願いいたします。

質問者からの補足コメント

  • うーん・・・

    ご回答いただきまして誠にありがとうございます。

    Aテーブルは集計結果を保持しています。

    EXPLAINで見ると、type:ref、possible_keys:Index01、key:Index01、rows:28687 で
    もともとはIndex使用してくれているみたいなのですが。。

    select文を発行する時間帯によって挙動が変わる現象がどうにも解せません。

    お手数をお掛けしますが何かありましたら、引き続きご教示お願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/12/17 15:08

A 回答 (2件)

>Aテーブルは集計結果を保持しています。



集計結果からさらに集計ってしてます?
むしろ集計後の集計をしていないならインデックスは不要でつねにデータの垂れ流しですから

イメージ的には
膨大なデータがあって→その日参照したいデータだけ朝つくってテーブルに保持→
パターン1)ユーザーは絞り込みや集計せずそのデータを読み出すだけ
解決策:キャッシュもなにも不要で、毎回同じデータを抽出するだけなら
ファイルか何に保持しておけば済むでしょう

パターン2)あくまでもユーザーは任意の条件で抽出(WHEREやらHAVINGやら)
もしくは、集計(SUMやらCOUNT)をおこなう
解決策:検索条件を想定し、Aテーブルに適切なインデックスを設定して、抽出する
    • good
    • 0
この回答へのお礼

ご回答いただき、大変お手数をお掛けしました。

いろいろ試してみたいと思います。
ありがとうございました。

お礼日時:2015/12/21 12:08

レコード数にもよりますが、集計に3秒は微妙ですね・・・なんか遅いように感じますけど


Aテーブルは集計結果を保持しているのではなく生データってこと?
キャッシュをどうするこーするより、適切なindexを貼ればいいような気がしますが・・・

もともと5分程の時間かかるようなSQL文なんじゃないんですかねぇ?
EXPLAINなどでチェックはされていますか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!