先日、担当しているWebサイトにおいてレポート画面が重たいとの
連絡を頂いて原因を調べる事に。
まー原因は私が担当する以前からあった問題でしたが、
インデックスが正しく機能していないという事でした。
そこで今一度おさらいです。
インデックスとは、データの検索速度を向上させるために、
どの行がどこにあるかを示した索引のことです。
すべての行を1行ずつ調べるよりも索引を利用して目的の行の場所を見つけてから
その行のデータを読み取る方が効率がよいと考えられます。
基本的な仕組みはこちらが非常にわかりやすくなっているかと思います。
いつもながら先人様に感謝です。
で、本題に戻りますが原因は以下でございました。
※createdカラムにインデックスが貼ってあるとします。
SELECT id FROM table1 WHERE (created)::text LIKE '2013%'
↓
SELECT id FROM table1 WHERE created >= '2013-01-01 00:00:00' AND created <= '2013-12-31 23:59:59'
まず、前方一致検索を行っているのでインデックスは正常かと思いきや
WHERE分の左側にてキャストや演算を使ったりするとインデックスが有効にならないのですね。
レコードが数件程度でしたらまったく問題ないと思いますが、
これが数百万件あるレコードの場合、またサブクエリなど用いた場合には
要注意ですね。
さて今年も6月に毎年恒例の石垣島旅行にいけるかな。。