文件
shanghaipeiwan/server/tests/list-pagination-index.spec.ts
xcbyy cbf77a7252 perf(db): 高频查询补索引 + 大列表加合理上限(避免全表下发)
- 启动建表后幂等补索引:orders/finance_records/users/reports/companions/payment_intents/payment_refunds 等高频查询列

- 管理端订单/财务流水/用户列表 LIMIT 500,友圈/评价列表 LIMIT 200,防止无界查询

- expert_services 懒建表后补 expert_id 索引

- 新增回归护栏 list-pagination-index.spec.ts(84 套件/625 用例全绿)
2026-10-19 09:28:02 +08:00

38 行
1.6 KiB
TypeScript

// 已读取AGENTS.md
import * as fs from 'fs';
import * as path from 'path';
/**
* 第六十八批回归闸门:列表有界 + 高频查询索引
*/
describe('第六十八批分页与索引闸门', () => {
const rootDir = path.resolve(__dirname, '../../');
const repoCode = fs.readFileSync(path.join(rootDir, 'server/src/db/repository.ts'), 'utf-8');
const mysqlCode = fs.readFileSync(path.join(rootDir, 'server/src/db/mysql.ts'), 'utf-8');
it('大列表查询必须有上限(避免全表下发)', () => {
expect(repoCode).toContain("sql += ' ORDER BY id ASC LIMIT 500'");
expect(repoCode).toContain("sql += ' ORDER BY is_top DESC, created_at DESC LIMIT 200'");
expect(repoCode).toContain("sql += ' ORDER BY created_at DESC LIMIT 200'");
// 管理端财务流水
expect(repoCode).toContain('LIMIT 500');
});
it('提供高频查询索引(幂等)', () => {
expect(mysqlCode).toContain('idx_orders_buyer');
expect(mysqlCode).toContain('idx_orders_status_created');
expect(mysqlCode).toContain('idx_fin_user');
expect(mysqlCode).toContain('idx_users_phone');
expect(mysqlCode).toContain('idx_pr_order');
// 索引创建必须在所有建表之后,避免表不存在
const createIdx = mysqlCode.indexOf('const indexDefs');
const seedCall = mysqlCode.indexOf('await seedInitialDataIfEmpty(conn)');
expect(createIdx).toBeGreaterThan(-1);
expect(seedCall).toBeGreaterThan(createIdx);
});
it('expert_services 懒建表后补索引', () => {
expect(repoCode).toContain('ALTER TABLE expert_services ADD INDEX idx_srv_expert');
});
});