このクエリがあります
SELECT
shot.hole AS hole,
shot.id AS id,
(SELECT s.id FROM shot AS s
WHERE s.hole = shot.hole AND s.shot_number > shot.shot_number AND shot.round_id = s.round_id
ORDER BY s.shot_number ASC LIMIT 1) AS next_shot_id,
shot.distance AS distance_remaining,
shot.type AS hit_type,
shot.area AS onto
FROM shot
JOIN course ON shot.course_id = course.id
JOIN round ON shot.round_id = round.id
WHERE round.uID = 78
これにより、約 0.7 秒で 900~ 行が返されます。これは問題ありませんが、このような行がさらに必要です
(SELECT s.id FROM shot AS s
WHERE s.hole = shot.hole AND s.shot_number > shot.shot_number AND shot.round_id = s.round_id
ORDER BY s.shot_number ASC LIMIT 1) AS next_shot_id,
例えば
(SELECT s.id FROM shot AS s
WHERE s.hole = shot.hole AND s.shot_number < shot.shot_number AND shot.round_id = s.round_id
ORDER BY s.shot_number ASC LIMIT 1) AS past_shot_id,
これを追加すると、ロード時間が数十秒に長くなり、ページがまったくロードされないか、MySQL がロックアップしshow processlist
て、クエリがそこにあることが示されますsending data
。
これらのサブクエリで句を削除するORDER BY s.shot_number ASC
と、クエリ時間が 0.05 秒に短縮され、はるかに改善されます。ただし、ORDER BY
古いランダムな行ではなく、次または過去の行 (ショット) が返されるようにするために必要です。
このクエリを改善して、実行速度を上げて同じ結果を返すにはどうすればよいですか。おそらく、次の行と過去の行を取得するための私のアプローチは最適ではなく、次の行 ID と前の行 ID を返す別の方法を検討する必要がありますか?
編集 - 追加の背景情報
私のテスト用ドメインであるサブドメインでは、クエリは問題ありませんでした。しかし、ライブ ドメインに移動すると、問題が発生しました。ほとんど何も変更されていませんが、これらの新しい遅いクエリのためにサイト全体が停止しました. 重要な注意事項:
- 別のドメイン
- /var/www 内の別のフォルダー
- 同一DB
- 同じ DB 資格情報
- 同じコード
- 修正を試みてインデックスを追加しました - これは役に立ちませんでした
これらのいずれかがロード時間に影響を与える可能性はありますか?