F.Ko-Jiの「一秒後は未来」

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の記述は存在していて、これで本当に大丈夫なのかちょっと気になります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など