Skip to content

Conversation

gakigaki
Copy link
Contributor

@gakigaki gakigaki commented Jul 8, 2025

概要

サイト内検索プラグインにおいて、PageRole::getPageRoles()が全ページ数だけ実行されていました。
処理時間を計測したところ、getPageRoles()1回の実行時間は約140msでした。
よって、ページ数が多いほど深刻なパフォーマンス問題が発生します。
上記事象を解決するため、まずはINDEXを追加しました。

変更内容

マイグレーション

  • page_rolesテーブルに複合INDEX idx_page_roles_on_page_id_and_group_id (page_id, group_id)を追加
  • group_usersテーブルに複合INDEX idx_group_users_on_user_id_and_group_id (user_id, group_id)を追加

技術的詳細

問題の原因

  • PageRole::getPageRoles()でのJOINクエリにINDEXが不足
  • N+1クエリ問題により大量のクエリが個別実行される
  • 特にpage_rolesgroup_usersテーブル間のJOIN操作が遅い

解決方法

  • クエリのWHERE句で使用される(page_id, group_id)(user_id, group_id)に複合INDEXを追加
  • MySQLのクエリオプティマイザーがINDEXを効率的に使用してJOIN操作を最適化
  • INDEX追加の結果、getPageRoles()1回の実行時間は数100μs程度に軽減する

影響範囲

  • プラス影響: サイト内検索の大幅な高速化
  • マイナス影響: INSERT/UPDATE時の若干のオーバーヘッド(通常は無視できるレベル)
  • 互換性: 既存機能に影響なし

対応しなかったこと

  • N+1の解消
    • SearchsPlugin::fetchSearchablePageIds() でN+1問題が発生しています
    • 親ページの取得: Page::reversed()->ancestorsAndSelf($this->id);
    • ページ権限の取得: PageRole::getPageRoles($page_tree->pluck('id'));

gakigaki and others added 4 commits July 8, 2025 19:01
## 概要
サイト内検索プラグインにおけるPageRole::getPageRoles()メソッドの
パフォーマンス問題を解決するため、データベースINDEXを追加しました。

## 変更内容
- page_rolesテーブルに複合INDEX(page_id, group_id)を追加
- group_usersテーブルに複合INDEX(user_id, group_id)を追加
- パフォーマンステストを実装して効果を検証

## パフォーマンス改善結果
1,000ユーザーでの検証結果:
- 全体実行時間: 617ms → 324ms(47.5%改善)
- PageRoleクエリ時間: 160ms → 80ms(49.7%改善)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
- テストメソッド名をcamelCaseに変更
- function キーワード後のスペースを追加(phpcbf自動修正)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@gakigaki gakigaki changed the title [サイト内検索] PageRole検索パフォーマンス向上のためのINDEX追加 [サイト内検索] ページ数が多い場合の検索パフォーマンスを向上しました Jul 9, 2025
@gakigaki gakigaki added enhancement 機能強化 plugin(search) サイト内検索プラグイン labels Jul 9, 2025
@gakigaki gakigaki merged commit 9760c79 into master Jul 9, 2025
1 check passed
@gakigaki gakigaki deleted the feature/search-performance-index-optimization branch July 9, 2025 01:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement 機能強化 plugin(search) サイト内検索プラグイン
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant