0

サイトの「初期化」コードのさまざまな部分のタイミングを調整しています(ユーザーがログインしていることの確認、データベースへの接続、関数のインポートなどを含む)

このクエリは現在、初期化時間全体の約半分を占めています。

$sql = "update `users` set `lastclick`=now(),".(substr($_SERVER['PHP_SELF'],0,6) == "/ajax/" ? "" : " `lastactive`=now(),")." `lastip`='".addslashes($_SERVER['REMOTE_ADDR'])."' where `id`=".$userdata['id'];

クエリの生成にはまったく時間がかかりません。問題は実行中です。結果クエリの例:

update `users` set `lastclick`=now(), `lastactive`=now(), `lastip`='192.168.0.1' where `id`=1

十分に単純なクエリですよね?私は現在サーバー上の唯一のユーザーであり、文字通り他に何も実行されていません。では、なぜ単純な更新は、データベースに接続しSELECT、最初にユーザーデータを取得し、Cookieを検証し、一連の関数をすべて組み合わせて定義するよりも時間がかかるのでしょうか。

(リテラル値に置き換えnow()てみましたが、違いはありませんでした。実際、最初は4ミリ秒ではなく13ミリ秒かかりました...)


編集:要求に応じて:

explain select * from  `users` where `id`=1
1 row returned

id select_type table type  possible_keys key     key_len ref   rows Extra
1  SIMPLE      users const PRIMARY       PRIMARY 4       const 1
4

1 に答える 1

2

私自身の謎を解きました。更新されているフィールドの1つ(lastactive)がインデックスにあり、そのインデックスの再構築が原因で速度が低下していることがわかりました。

インデックスが使用されるのはオンラインのユーザーのリストを更新するときだけであり、それは設定された間隔ごとにcronによってのみ発生するため、インデックスを削除しました。クエリの実行速度が大幅に向上しました。

助けてくれた人たちに感謝します-あなたは私が間接的に問題を見つけるのを助けてくれました!

于 2012-05-17T17:06:48.790 に答える