• ベストアンサー

インデックスの張り方について

とあるテーブルのレコード数は、全部で28レコードあります。 このテーブルにはインデックスを張っておらず、シーケンシャルスキャンでDBよりSELECTしています。 通常にシステムを運用する上では問題ないのですが、負荷試験などで同時接続数を50などにしループでDBにアクセスさせるとき、その他の4000万レコード程度あるテーブルをSELECTしてくるのは0.00xxx秒で行えるのに対し、この28レコードしかないテーブルからSELECTしてくる際は、遅い場合で0.xx秒もかかってしまいます。 この28レコードしかないテーブルにインデックスを張っても、レコード数が少なすぎてまったく意味がありませんでした。 ちなみにこのレコードへは下記のようなSELECT文を発行しています SELECT xxx,xxx,xxx FROM xxxx where カラム1 = aaaa AND カラム2 IN (bbb,ccc) AND カラム3 = ddd; このレコードのSELECT文を高速化させるには、どのような手段があるでしょうか。 お手数ですがご教示いただけますと幸いでございます。 DBはPostgreSQL、PHPのWebアプリケーションよりDBにアクセスしています。

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

  • ベストアンサー
  • alte_6
  • ベストアンサー率60% (9/15)
回答No.2

(遅い場合で0.xx秒)が遅いのかどうかは不明ですが・・ 4000万レコード程度あるテーブルのクエリーが0.00xxx秒というのは どういうSQLでしょうか またどうやって測ったのでしょうか?EXPLAIN ANALYZEでしょうか? 28件のTABLEへはどういったインデックスを張ったのでしょうか? 条件にある主キーカラムにインデックスを張っていますでしょうか。 主キーカラム以外の条件を取り除くか、もしくはすべての条件カラムを含む 複合索引を張って検索を行ってみてはどうでしょうか。^^ #EXPLAINでカラム2のIN関数でインデックスを使用しない事があれば #(カラム2=bbb OR カラム2=ccc)に置き換えてしてみて下さい。

myaa_myu
質問者

お礼

EXPLAIN ANALYZEでも図りましたし、実際運用していて、どのSQLにどれくらいのセレクト時間がかかるか、すべてログに残していて、それを見て発見いたしました。 条件にある主キーカラムにインデックスを張ってみましたが、やはり変わりありませんでした。。 複合索引を張ってみましたが、それも効果はないようです、、、 もう少し考えて見ます、ありがとうございました。

その他の回答 (1)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

とあるテーブルを vacuum FULL してもだめでしょうか。

myaa_myu
質問者

お礼

一応、全テーブル毎日vacuumしているため、このテーブルもバキューム対象です。。 念のためもう一度してみましたが、効果はありませんでした。

関連するQ&A