ADOdbのセッション管理でスロークエリ
個人的によく ADOdb というPHP用のデータベースライブラリを使うのですが、その ADOdb を使ってセッション管理をしていたら、ある時点からスロークエリーが発生し始めて困ったという話です。
スロークエリログを見たところ発生していたスロークエリは以下のようなものでした。
SELECT COUNT(*) AS cnt FROM sessions2 WHERE /*! BINARY */ sesskey = 'セッションキー';
ここにあまり見慣れない「/*! BINARY */」というものがあるのですが、どうも BINARY型にキャストする用途で使うみたいです。
問題なのは、この「/*! BINARY */」があるとインデックスが使われないという点。 sessions2 テーブルは sesskey が PRIMARY KEY なのでインデックスが使われるはずですが、EXPLAIN で調べてみると使われていませんでした。
そのためテーブルのレコード数が増えると次第に処理が重くなってしまいます。
この BINARY へのキャストは必要なのかどうなのか気になったので検索して調べてみると「[#MDL-16641] Remove all attempts to cast sesskey to BINARY as it was causing MySQL to ignore the preferred index, resulting in slow response time – Moodle Tracker」というページに行き当たりました。
これを見ると adodb-session2.php のソースコードから「/*! BINARY */」の部分を消しても問題ないようなので、さくっと削除。これで無事にインデックスが使われるようになり、パフォーマンスの問題も解決しました。
ただ上記のスレッドを見てバージョンが古いのかなとも思ったのですが、最新のソースコードにもBINARYの記述は存在していて、これで本当に大丈夫なのかちょっと気になります。
コメントを残す