今更という感じもあるのですがハマッテしまったので自分のメモとして記事にしておきます。
あるシステムのリプレースをすることになりDBの100万件ぐらいあるcustomerテーブルに対してmembernoの項目で検索した所、3秒ぐらい検索に掛かってしまっていました。
SQLは「SELECT * FROM customer WHERE memberno = 2154874;」と記述していました。
リプレース前のシステムを見てみると、この処理の所は一瞬でデータを取得しているぞという事で原因探しをします。
インデックスもmembernoで張られているのでおかしいなーと思って上記のSQLを流してみると、どうもインデックスが使われていない結果が出てきます。
何でかなーと思いphpMyAdminの検索でmembernoに2154874と入れて検索してみると一瞬でデータを取得した!!
えっと思いSQLを見てみると「SELECT * FROM customer WHERE memberno = ‘2154874’;」と書かれている。
SQLを見比べてみるとシングルコートがあるかないかの違いでけだということでテーブル構造を見てみるとmembernoはVARCHAR型でした・・・
VARCHAR型にシングルコート無しの数字を渡すとINT型と判断されてVARCHAR型に変換してから検索する為インデックスも使われないみたいです。
という事でシングルコートを付けて検索すると無事に一瞬でデータの取得が出来ました。
結構はまってしまったので解決して良かった良かった。(まーそもそも数字だけが入って来るmembernoにVARCHAR型を付けているのが問題ありなのですが・・・)