2009年3月16日月曜日

mysql index

backtestをしていると、ある一定時間経つと急激に遅くなっていたので
調査をしてみた。
最初は、Buffer poolが足りないのかなと思って増やしていたのだけど
それでも、遅くなるまでの時間が長くなるだけでまた遅くなる。
backtestを行うtick tableのスタートポイントを変えてみたのだけど
必ず遅くなっていた近辺でやっぱり遅くなることが判明。
ということで、SQLをexplainしてみてみると、
where: file: sortといった感じで、見たくない文字が、、、。
そこで、MySQLのIndexが使用されない場合を検索してみると
order byで指定しているカラム以外をwhereに使ってると
使われないといった記述があった。
実はそれ以外にも結構使用されない場合があるみたい。
named_scope: barsの中のSQLで、datetimeをorder byで使っていて
whereの中は、
datetime >= xxx and open is not NULL, close is not NULL
としていたので、sortがfileになっていたみたい。
とりあえず、NULLかどうかはアプリ側で判断することにして条件を外す。
1テーブルあたりのselectが0.43msから、0.01msへ。
ということで、体感的にもかなり速くなった。SQLは重要。

0 件のコメント:

コメントを投稿