PHPというより、MySQLなんですが、PHPからMySQLを利用してるんで、このあたりのカテゴリ選択は目をつぶってください。
さて、MySQLを使うようになって、今まで使ってきてたParadoxとかDBISAMとかとは違った、本格的なDBMSの世界へ一歩を踏み込みました。
今までで一番感動したのは、explainによるSQL文の解析です。
explainを利用して、インデックスがちゃんと使われてるかどうかを確かめることができるなんて、すばらしいです。今までのはDBMSではなかったので、このあたりの機能が欠けてたことに気づかされました。
さて、そのMySQLですが素晴らしいことばかりじゃありません。こりゃあかんだろーって事もあります。
その一つが、インデックス選択が駄目駄目すぎること。ある二つの項目で検索するので、その二つの項目に二次インデックスを作成したにも関わらず、明示的に指定しないと使ってくれません。んで、あれこれ調べてみると、その二つの項目のうちの一つがDATETIME型なんですが、このDATETIME型に対して
selec * from hote_table
where hoge_code = 1 and hoge_date < '2005-05-17'
なんて検索をしちゃうと、駄目みたいなんです。んで、CASTしてみたら上手くいくかと思って
selec * from hote_table
where hoge_code = 1 and hoge_date < CAST('2005-05-17' AS DATETIME)
なんてのも試してみましたが、これでも相変わらずインデックスをきちんと使ってくれません。
仕方ないので、最終的には、
selec * from hote_table use index(hoge_index)
where hoge_code = 1 and hoge_date < CAST('2005-05-17' AS DATETIME)
とするしかありませんでした。ちなみに、USE INDEXを使った場合、CASTを明示的にする必要はありません。つまり、
selec * from hote_table use index(hoge_index)
where hoge_code = 1 and hoge_date < '2005-05-17'
でも同じ結果になります。むむむむ…。なんてうんこなんだ、MySQLめ。
Recent Comments