---
name: performance-rules
type: review_rule
when: '代码审查, review, 性能检查, 性能优化'
scope:
  - backend
  - frontend
products:
  - '*'
id: ka-review-rule-性能审查规则
asset_kind: review_rule
lifecycle_status: active
owner_mechanism_id: mc-generic-review
authority: supporting
routes:
  - code_change
primary_triggers:
  - 性能审查规则
secondary_triggers: []
negative_triggers: []
priority: P1
specificity: 5
version: 1.1.0
last_reviewed: '2026-06-01'
stages: ["代码审查"]
---

## PER-01: 循环内逐条数据库调用（N+1 问题）
pattern: /(?:for|while)\s*\(.*\)[\s\S]*?\.(?:save|insert|update|delete|query|select|findBy)\s*\(/
severity: critical
scope: backend
description: 循环内禁止逐条数据库操作，必须使用批量 SQL 或 IN 查询

## PER-02: SELECT * 查询未指定字段
pattern: /SELECT\s+\*\s+FROM/i
severity: info
scope: backend
description: 查询应明确指定所需字段，避免传输不必要的数据

## PER-03: 未使用分页的大列表查询
pattern: /findAll\s*\(\s*\)|\.toList\(\)\s*;|find\s*\(\s*\{\s*\}\s*\)/
severity: warning
scope: backend
description: 列表查询必须分页，禁止一次加载全量数据

## PER-04: 大循环内创建对象或字符串拼接
pattern: /(?:for|while)\s*\(.*\)[\s\S]*?new\s+(?:ArrayList|HashMap|StringBuilder)/
severity: info
scope: backend
description: 大循环内避免重复创建对象，应提前初始化或使用对象池

## PER-05: 前端组件不必要的重渲染
pattern: /onClick=\{\(\).*=>|style=\{\{/
severity: info
scope: frontend
description: 内联函数和对象作为 props 会导致子组件不必要的重渲染，应使用 useCallback/useMemo

## PER-06: 未使用 useMemo/useCallback 的高开销计算
pattern: /(?:\.sort|\.filter|\.map|\.reduce)\s*\(.*=>.*(?:\.sort|\.filter|\.map)/
severity: info
scope: frontend
description: 链式数组操作或高开销计算应使用 useMemo 缓存结果，避免每次渲染重复计算

## PER-07: 未使用连接池的数据库连接
pattern: /DriverManager\.getConnection/
severity: warning
scope: backend
description: 禁止使用 DriverManager 直接创建连接，必须使用连接池（HikariCP/Druid）

## PER-08: 大事务包含非必要操作
pattern: /@Transactional[\s\S]*?(?:log\.|email|send|notify|http)/
severity: warning
scope: backend
description: @Transactional 方法内禁止包含发送邮件、HTTP 调用、MQ 发送等非必要操作，避免长事务

## PER-09: 前端图片未压缩或懒加载
pattern: /<img\s+src=/
severity: info
scope: frontend
description: 图片资源必须使用压缩/懒加载/响应式加载，禁止原始大图直接展示
