自分のサイトでオンラインになっているユーザーを追跡する必要があるため、オンラインユーザーのアバターの隣に「オンライン」アイコンを表示することができます。このようにしたときにMySQLクエリが高速になるのはなぜですか?このようにすると遅くなりますか?
これを検出する第1のステップは、ユーザがそのように私はUPDATEクエリにユーザーがページを要求するたびにやって最後に見たときのトラックを維持することです:今
UPDATE `users`
SET `last_seen` = CURRENT_TIMESTAMP
WHERE `user_id` = '$user_id'
右この後、私は実行別のクエリ、私はホームページ上でそれらを表示することができますので、この1つは、特定の基準の下で私のサイトのすべてのユーザーを取得します:
SELECT *,
(ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) AS SearchRadius
FROM `users`
INNER JOIN `profiles` ON (
users.user_id = profiles.user_id
)
WHERE (users.latitude > 38.904216788163 AND users.latitude < 42.501503211837)
AND (users.longitude > -76.252301637251 AND users.longitude < -71.507178362749)
AND (ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) < 200 AND users.sex = '1' AND users.seeking = '2' AND users.user_id != '1' AND users.account_status = '1' LIMIT 0, 10
このクエリの狂気を気にしないが、基本的にはポイントは、私は同じusers
から選択していますです私が以前に更新したテーブルing。私は別の後にこれらの2つのクエリのいずれかを実行すると
これらは私が得る時間は以下のとおりです。
は1st query: 0.0392 seconds
2nd query: 1.5396 seconds
これは、ページの読み込み時間に著しい遅延が発生します。今
私はオンラインユーザーのために別のテーブルを作成し、これに最初のクエリを変更します。
1st query: 0.0411 seconds
2nd query: 0.0008 seconds
とページのロードはるかに高速:
UPDATE `online_users`
SET `last_seen` = CURRENT_TIMESTAMP
WHERE `user_id` = '$user_id'
回はこれに変更!
これはなぜですか?私の推測では、テーブルのロックと関係がありますが、詳細を知っているか分かっているか分かりません。
2番目のクエリでも正しい結果が返されますか? –
最初のクエリを使わずに2番目のクエリを実行した方が高速ですか?何らかのI/O問題である可能性があります.MySQLの内部構造ではありませんが、SQLの意味でブロックされているものであってはなりません。同じトランザクション内の同じ接続上にあっても、この場合、コミットされていない変更が表示されるか、変更がすでにコミットされています。 InnoDBまたはMyISAMを使用していますか? –
@Cade Roux 2番目のクエリを単独で実行した場合、それは高速ですが、0.0004というわずかな分だけです。私はMyISAMを使用しています。 – TK123