From c5d19f47a242ab560fac97e1c8b3830de53fb05e Mon Sep 17 00:00:00 2001 From: KodouWZF <3092554823@qq.com> Date: Tue, 3 Nov 2026 22:03:33 +0800 Subject: [PATCH] =?UTF-8?q?perf(=E4=BC=A0=E8=BE=93):=20xs=5Ffile=5Frecord.?= =?UTF-8?q?md5=5Fcode=20=E8=A1=A5=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文件入库时用 MD5 做内容去重查询(FileServiceImpl 上传后 find(md5Code)), 该列此前没有索引,每个文件入库都是一次全表扫描。解包一个含 N 个文件的 传输包就是 N 次全表扫描,300 人规模下 xs_file_record 达数万行时, 单文件入库可省几十到几百毫秒,100 个文件的包可省数秒到数十秒。 按 init 与 upgrade 双写:MySQL 版 DDL 加 KEY,PG 版加 CREATE INDEX, 新建 upgrade-20261103-transfer-perf.sql 供已上线环境增量执行 (DM8 走第 1 节,PG 走第 2 节,并给出 CONCURRENTLY 备选)。 交付包 sql/01-init-table.sql 按 README 要求从仓库整份覆盖,不手改副本。 --- backend/db/init-table-postgres-full.sql | 1 + backend/db/init-table.sql | 3 ++- backend/db/upgrade-20261103-transfer-perf.sql | 26 +++++++++++++++++++ deploy/offline/sql/01-init-table.sql | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 backend/db/upgrade-20261103-transfer-perf.sql diff --git a/backend/db/init-table-postgres-full.sql b/backend/db/init-table-postgres-full.sql index c595562..d36b79d 100644 --- a/backend/db/init-table-postgres-full.sql +++ b/backend/db/init-table-postgres-full.sql @@ -1497,6 +1497,7 @@ CREATE TABLE xs_file_record ( proxy_by BIGINT DEFAULT NULL ); CREATE INDEX idx_file_code ON xs_file_record(file_code); +CREATE INDEX idx_file_record_md5_code ON xs_file_record(md5_code); COMMENT ON TABLE xs_file_record IS '附件信息'; COMMENT ON COLUMN xs_file_record.id IS '主键ID'; COMMENT ON COLUMN xs_file_record.file_code IS '文件编码'; diff --git a/backend/db/init-table.sql b/backend/db/init-table.sql index 20023cf..143f222 100644 --- a/backend/db/init-table.sql +++ b/backend/db/init-table.sql @@ -965,7 +965,8 @@ CREATE TABLE `xs_file_record` ( `update_time` datetime DEFAULT NULL COMMENT '修改时间', `proxy_by` bigint(20) DEFAULT NULL COMMENT '代理人', PRIMARY KEY (`id`), - KEY `idx_file_code` (`file_code`) + KEY `idx_file_code` (`file_code`), + KEY `idx_file_record_md5_code` (`md5_code`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='附件信息'; -- ---------------------------- diff --git a/backend/db/upgrade-20261103-transfer-perf.sql b/backend/db/upgrade-20261103-transfer-perf.sql new file mode 100644 index 0000000..d1f4b43 --- /dev/null +++ b/backend/db/upgrade-20261103-transfer-perf.sql @@ -0,0 +1,26 @@ +-- ============================================================= +-- 升级脚本:跨网传输链路性能优化(第一批) +-- 日期:2026-11-03 +-- 说明:给 xs_file_record.md5_code 补索引。 +-- 文件入库时会用 MD5 做内容去重查询 +-- (FileServiceImpl 上传 → find(md5Code)),此前该列无索引, +-- 每个文件入库都是一次全表扫描。解包一个含 N 个文件的传输包 +-- 就是 N 次全表扫描,数据量上来后是多文件解包的主要数据库开销。 +-- 新环境由 init 脚本建表时已包含该索引,本脚本仅供已上线环境增量执行。 +-- 执行方式:MySQL/达梦(DM8 MySQL兼容模式)执行第 1 节; +-- PostgreSQL 执行第 2 节。 +-- 注意:表数据量大时建索引会锁写,建议业务低峰执行。 +-- 重复执行会报「索引已存在」,忽略即可。 +-- ============================================================= + +-- ------------------------------------------------------------- +-- 1. MySQL / 达梦 DM8 +-- ------------------------------------------------------------- +CREATE INDEX idx_file_record_md5_code ON xs_file_record(md5_code); + +-- ------------------------------------------------------------- +-- 2. PostgreSQL +-- ------------------------------------------------------------- +-- 表已有数据且不能停写时,改用下面这句(不可在事务块内执行): +-- CREATE INDEX CONCURRENTLY idx_file_record_md5_code ON xs_file_record(md5_code); +CREATE INDEX IF NOT EXISTS idx_file_record_md5_code ON xs_file_record(md5_code); diff --git a/deploy/offline/sql/01-init-table.sql b/deploy/offline/sql/01-init-table.sql index c595562..d36b79d 100644 --- a/deploy/offline/sql/01-init-table.sql +++ b/deploy/offline/sql/01-init-table.sql @@ -1497,6 +1497,7 @@ CREATE TABLE xs_file_record ( proxy_by BIGINT DEFAULT NULL ); CREATE INDEX idx_file_code ON xs_file_record(file_code); +CREATE INDEX idx_file_record_md5_code ON xs_file_record(md5_code); COMMENT ON TABLE xs_file_record IS '附件信息'; COMMENT ON COLUMN xs_file_record.id IS '主键ID'; COMMENT ON COLUMN xs_file_record.file_code IS '文件编码';