PR

[WIP]召喚の書ボーナス取得 DBアクセス回数削減 #4691

kouho opened this at 2026-06-01T11:13:28; open

Description

opened by kouho at 2026-06-01T11:13:28; updated 2026-06-01T11:15:49

概要

夜会キャンペーンに向けた負荷対策 その1

対応の前提

ジョリーの通常のゲームページおよび Ajax リクエストでは、リクエスト開始時のログイン処理で user_lock によるユーザー単位の排他制御が行われる。

そのため、同一ユーザーのリクエストで重い処理が発生すると、その処理が完了して user_lock が解放されるまで、後続の同一ユーザーリクエストは user_lock の取得待ちになる。

アクセス集中やサーバー負荷の増大により個々のリクエスト処理時間が伸びると、ユーザーの再読み込みや画面操作による後続リクエストが滞留しやすくなる。結果として、PHP プロセスや DB 接続がロック待ち状態で消費され、サーバー全体の負荷増大につながる可能性がある。

夜会キャンペーンでは集中アクセスによりこの影響が顕著になりやすいため、キャンペーン期間中に重くなる可能性がある処理を改善し、user_lock の保持時間および待ちリクエストの増加を抑えることを目的とする。

対応背景

5/21と5/22のレイド開催時のDatadogとアクセスログ上、問題となった箇所に対応を入れる

codexにアクセスログとDatadogのデータを渡した際の出力抜粋

Datadog の解析

最優先
SELECT COUNT (?) FROM log_team_raid_item WHERE raid_monster_no = ? AND user_no = ?

直近1日で約127K回出ています。

アクセスログの解析

最優先は /ajax.php?M=main&A=default 経由の count_user_raid_item() 削減です。
このURLはログ上で約 402K回 / 総処理時間 42,749秒 / 平均 0.106秒 と、累積負荷が最大です。

※Datadogのみで解析した際に該当クエリの最適化をAIから提案されましたが、EXPLAIN結果を踏まえて対応不要という結論になりました。調査が被ると時間の無駄になるため、メモとして残しておきます。

対応内容

Default.incでの召喚の書ボーナス取得時に 未受け取りのレイド報酬の回数分 log_team_raid_itemに対するSELECTが行われていた。
これをGROUP BYを使い、SELECTを1回に減らしクエリの実行回数を削減

TODO

  • [ ] Github移行後にPRの作成し直し

Commit range

basec1e55dbe79e5339080bd17aabb3109b4644b696e
heade6e0f16363120a51690d722507f305d41fb114f2
base branchjolly/jr-web:master
head branchjolly/jr-web:karukushitai

View commits

Commit details are loaded from Git when a dynamic archive server is running, or can be embedded with --include-commits.
Files changed2 filesView patch
statusfile
modifiedlib/SubFunc.inc
modifiedlib/models/dao/log_team_raid_item.php
Patch body is stored as a separate file to keep this page lightweight.