Back to list
changgenglu

performance-analyst

by changgenglu

0🍴 0📅 Jan 23, 2026

SKILL.md


name: "performance-analyst" description: "Activates when user requests performance optimization, N+1 query analysis, caching strategy design, database tuning, or scalability assessment. Do NOT use for security audits. Examples: 'Optimize this slow query', 'Check for N+1 problems'."

Performance Analyst Skill

🧠 Expertise

資深效能工程師,專精於資料庫優化、快取策略、系統擴展性設計,擁有大規模系統調優經驗。


1. 資料庫效能分析

1.1 N+1 查詢問題

定義:在迴圈中執行個別查詢,導致 1 + N 次資料庫請求。

識別模式

// ❌ N+1 Problem
$users = User::all();
foreach ($users as $user) {
    echo $user->profile->name;  // 每次迭代執行一次查詢
}

// ✅ Eager Loading 解決方案
$users = User::with('profile')->get();
foreach ($users as $user) {
    echo $user->profile->name;  // 無額外查詢
}

檢測工具

  • Laravel Debugbar
  • DB::enableQueryLog() + DB::getQueryLog()
  • Clockwork

1.2 索引優化

需要索引的欄位

情境建議
WHERE 條件單欄位索引
JOIN 條件外鍵索引
ORDER BY排序欄位索引
複合條件複合索引(順序重要)
唯一值查詢UNIQUE 索引

紅旗標誌

  • ❌ 大表無主鍵/索引的 WHERE 條件
  • ❌ LIKE '%keyword%' 查詢
  • ❌ 函數包裹索引欄位:WHERE YEAR(created_at) = 2024

索引建議

-- 複合索引順序:選擇性高的欄位在前
CREATE INDEX idx_orders_status_date ON orders(status, created_at);

-- 覆蓋索引:包含所有需要的欄位
CREATE INDEX idx_users_email_name ON users(email, name);

1.3 查詢優化

選取欄位最小化

// ❌ 選取所有欄位
User::all();

// ✅ 只選需要的欄位
User::select('id', 'name', 'email')->get();

分頁處理

// ❌ 載入全部資料
$users = User::all();

// ✅ 分頁查詢
$users = User::paginate(20);

// ✅ Cursor 分頁(大資料集)
$users = User::cursor();

批次處理

// ❌ 記憶體爆炸
$users = User::all();
foreach ($users as $user) { /* 處理 */ }

// ✅ Chunk 分批處理
User::chunk(1000, function ($users) {
    foreach ($users as $user) { /* 處理 */ }
});

// ✅ Lazy Collection(更省記憶體)
User::lazy()->each(function ($user) { /* 處理 */ });

2. 時間/空間複雜度分析

2.1 時間複雜度

複雜度名稱範例
O(1)常數陣列索引存取、雜湊表查詢
O(log n)對數二元搜尋
O(n)線性單次迴圈
O(n log n)線性對數快速排序、合併排序
O(n²)平方雙重巢狀迴圈
O(2ⁿ)指數遞迴費氏數列

紅旗標誌

  • ❌ 隱藏的 O(n²) 巢狀迴圈
  • ❌ 遞迴無 memoization
  • ❌ 迴圈內執行 IO 操作

2.2 空間複雜度

記憶體風險

// ❌ 高記憶體使用
$allData = DB::table('big_table')->get();  // 全部載入記憶體

// ✅ 串流處理
DB::table('big_table')->cursor()->each(function ($row) {
    // 逐筆處理
});

記憶體洩漏風險

  • 迴圈內累積陣列
  • 未釋放的資源(檔案Handle、Connection)
  • 靜態變數累積

3. 快取策略

3.1 快取層級

層級用途TTL 建議
應用層快取業務資料、查詢結果5-60 分鐘
HTTP 快取靜態資源、API 回應1-24 小時
資料庫查詢快取複雜查詢結果1-5 分鐘
Session 快取使用者狀態Session 生命週期

3.2 快取 Key 設計

命名規範

{prefix}:{entity}:{identifier}:{version}

範例

// ✅ Good
"user_profile:123:v1"
"game_list:platform_1:active:v2"

// ❌ Bad
"user-profile-123"      // 不一致的分隔符
"userProfile:123"       // 命名風格不一致
"data:123"              // 缺乏語意

3.3 快取失效策略

策略適用場景優缺點
TTL 過期可容忍短暫過期的資料簡單,但有過期窗口
主動失效資料變更時清除精確,但需追蹤變更
Cache Aside讀多寫少靈活,需處理併發
Write Through寫入頻繁一致性高,寫入較慢

Laravel 快取範例

// Cache Aside 模式
$user = Cache::remember("user:{$id}", 3600, function () use ($id) {
    return User::find($id);
});

// 主動失效
public function updateUser($id, $data): User
{
    $user = User::findOrFail($id);
    $user->update($data);
    Cache::forget("user:{$id}");
    return $user;
}

4. 擴展性評估

4.1 水平擴展檢查

項目檢查要點
Session 管理是否使用分散式 Session(Redis/Database)
檔案儲存是否使用共享儲存(S3/NFS)
快取是否使用分散式快取(Redis Cluster)
任務佇列是否使用外部佇列服務(Redis/SQS)

紅旗標誌

  • ❌ 本地檔案 Session
  • ❌ 本地檔案儲存
  • ❌ 記憶體內快取(單機)
  • ❌ 同步處理耗時任務

4.2 負載壓力點識別

元件10x 負載100x 負載
資料庫連接池、讀寫分離分片、分表
快取Redis Cluster多層快取
應用伺服器負載均衡自動擴展
背景任務多 Worker任務分區

4.3 瓶頸識別

常見瓶頸

  1. 資料庫連接數 - 使用連接池
  2. 慢查詢 - 優化索引、快取
  3. 同步 IO - 改為非同步/佇列
  4. 單點故障 - 高可用架構

監控指標

指標健康閾值危險閾值
響應時間< 200ms> 1s
資料庫查詢< 50ms> 500ms
CPU 使用率< 70%> 90%
記憶體使用率< 80%> 95%

5. 效能審查評分標準

嚴重度定義範例
嚴重直接導致系統崩潰或極度緩慢N+1 大量查詢、記憶體洩漏
顯著影響效能(>3x 變慢)缺少關鍵索引、無分頁
可優化但非緊急快取未啟用、過度查詢欄位
最佳實務偏離Key 命名不規範、TTL 未設定

Score

Total Score

50/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon