Files
crawler-plugin/backend-java/src/main/resources/db/V123__drop_prefix_indexes.sql
T
huangzd1997 9a6b57db58 refactor+perf+fix: G5 模块边界 SPI 化、C5 流式解析、C6/C7 查询优化、D13 队列持久化、A3/A4/A7 鉴权
模块边界(G5 / G7)
- 新增 task/spi/TaskModuleHeartbeatSpi + 13 个模块实现:TaskHeartbeatService 不再 import 任何
  业务模块(原先注入 12 个 CacheService 并用 switch 分发);启动校验重复注册
- 新增 task/spi/BrandTaskHeartbeatSpi(品牌任务心跳/中断)、BrandTaskStaleRepairSpi(陈旧修复)、
  CollectDataItemCleanupSpi(历史清理):跨模块 Mapper 操作收回业务模块
- G7:10 个被跨模块借用的 productrisk VO 迁至 common/model/vo
- 架构棘轮收紧:TASK_TO_BUSINESS_BASELINE 119 → 6(实测)
- 新增 TaskModuleHeartbeatSpiCoverageTest(moduleType 覆盖与拼写)

性能与容量(C5/C6/C7/D13)
- C5 流式解析:SkipPriceAsinService(含两行表头语义)、AppearancePatentExcelParser、
  BrandTaskService、DeleteBrandRunService、LocalFileStorageService.getExcelInfo 改 ExcelStreamReader;
  行数上限改为迭代中生效
- C6 去重总数据列表:关键字改前缀匹配(命中 uk_data_value);V124 删除永不生效的 idx_country
- C7 撞款扫描:按店逐批取数(索引前缀),不再全表 GROUP BY + JOIN + 全量拉内存
- D13 待删对象本地日志 PendingDeleteJournal(启动回放 + 收敛重写),RustfsDeleteRetryService 与
  TransientPayloadDeleteOrchestrator 接入;异步删除失败对象写回日志
- V123 删除 biz_file_result 两个被复合索引覆盖的单列索引

安全(A3/A4/A7 + 守卫名单)
- A4 数字人版本写操作要求管理员;A7 视频密钥按登录身份(超管例外)
- A3 上传接口加危险扩展名黑名单(可配置)
- AdminApiGuardFilter 用户态名单补 /api/ziniao(controller 已 requireAdmin,此处为开关打开后的第二层)

容量(明细表保留期)
- 新增 ShopDataCrawlItemRetentionService:biz_shop_data_crawl_item 按保留期(默认 30 天)分批清理
  (该表此前无任何清理策略,是增长最快的表),job 锁 + 单轮批次上限
2026-09-14 06:46:27 +08:00

47 lines
1.8 KiB
SQL

-- V123: 删除 biz_file_result 上被复合索引完全覆盖的两个单列索引
--
-- 判定原则(同 V121):被删索引的列是另一索引的**严格前缀**,
-- 所有能用它的查询都能被保留的复合索引覆盖,删除只减少写入侧的索引维护与 buffer pool 占用。
--
-- 1) biz_file_result.idx_task_id (task_id)
-- 被 V38 的 idx_file_result_task_module_id (task_id, module_type, id) 覆盖。
-- 2) biz_file_result.idx_module_type (module_type)
-- 被 V34 的 idx_biz_file_result_module_user_created (module_type, user_id, created_at)
-- 与 V42 的 idx_file_result_patrol_history (module_type, user_id, created_at, id) 覆盖。
-- 两处均为 V1 建表时的遗留索引(当时还没有任何复合索引)。
--
-- 风险:DROP INDEX 为 INPLACE 在线操作,但会立即改变执行计划;两者均为「被覆盖」判定。
-- 回滚:
-- ALTER TABLE biz_file_result ADD INDEX idx_task_id (task_id);
-- ALTER TABLE biz_file_result ADD INDEX idx_module_type (module_type);
SET @db_name = DATABASE();
-- 1) biz_file_result.idx_task_id
SET @idx_exists := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'biz_file_result'
AND INDEX_NAME = 'idx_task_id'
);
SET @sql := IF(@idx_exists > 0,
'ALTER TABLE biz_file_result DROP INDEX idx_task_id',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 2) biz_file_result.idx_module_type
SET @idx_exists := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'biz_file_result'
AND INDEX_NAME = 'idx_module_type'
);
SET @sql := IF(@idx_exists > 0,
'ALTER TABLE biz_file_result DROP INDEX idx_module_type',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;