本文针对主流SpringBoot+MySQL架构的档案管理软件做优化,所有步骤无需重构原有核心代码,普通开发、运维都能直接上手,最终实现百万级档案秒级检索、附件快速读写的效果。
档案软件性能瓶颈80%出在存储层,核心原因是结构化元数据和非结构化文件混存,导致IO争抢,改造步骤如下:
将原本存在数据库或机械硬盘的扫描件、附件迁移到SSD,具体操作步骤(CentOS环境可直接复制命令):
``` 查看新挂载的SSD磁盘设备名,一般为/dev/vdb fdisk -l 格式化磁盘 mkfs.ext4 /dev/vdb 创建存储目录 mkdir -p /ssd/archive-files 临时挂载 mount /dev/vdb /ssd/archive-files 设置开机自动挂载 echo '/dev/vdb /ssd/archive-files ext4 defaults 0 0' >> /etc/fstab ```在SpringBoot配置文件中添加以下可直接复制的配置:
``` 档案文件存储配置 file: store-path: /ssd/archive-files/ ```改造后,100MB附件的下载响应速度可提升3倍以上。
如果档案条目超过10万条,直接按年度分表,使用MyBatis-Plus动态表名插件实现,先添加依赖:
```添加可直接复用的分表处理器:
``` @Component public class ArchiveTableHandler implements DynamicTableNameHandler { @Override public String dynamicTableName(String sql, String tableName) { Integer year = ArchiveContextHolder.getFilingYear(); if (year != null) { return tableName + "_" + year; } return tableName; } } ```新建分表直接执行以下模板SQL,修改年份即可:
``` CREATE TABLE archive_info_2024 LIKE archive_info; ```只给常用检索字段加索引,避免冗余索引增加写入负担,直接执行以下SQL创建必备索引:
``` -- 档号唯一索引,用于精确检索 ALTER TABLE archive_info ADD UNIQUE INDEX uk_archive_no(archive_no); -- 年度+保管期限联合索引,用于筛选 ALTER TABLE archive_info ADD INDEX idx_archive_year_term(filing_year, keep_term); -- 题名全文索引,MySQL5.7+原生支持,无需第三方服务 ALTER TABLE archive_info ADD FULLTEXT INDEX ft_archive_title(title); ```如果需要跨字段关键词检索,用Docker一键启动单节点Elasticsearch,无需复杂配置:
``` docker run -d --name es-archive -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.17.0 ```
创建索引用以下可直接复制的Mapping:
``` { "mappings": { "properties": { "archive_id": { "type": "keyword"}, "title": { "type": "text", "analyzer": "ik_max_word"}, "archive_no": { "type": "keyword"}, "filing_year": { "type": "integer"} } } } ```只需要同步档案元数据ID和检索字段到ES,检索时先从ES拿符合条件的ID,再回MySQL查详情,单节点即可支撑百万数据毫秒级检索,内存占用不到1G,普通2核4G服务器可稳定运行。
传统`LIMIT OFFSET`分页在翻页越往后越慢,改成游标分页,直接替换SQL即可:
优化前(慢):SELECT FROM archive_info LIMIT 10000, 20;
优化后(快):SELECT FROM archive_info WHERE id > 10000 ORDER BY id LIMIT 20;
前端只需要记录每次请求最后一条数据的id,下一页传给后端即可,性能提升10倍以上。
把档案分类、年度统计等不常变化的数据放到Redis,用Docker一键启动:
``` docker run -d --name redis-archive -p 6379:6379 redis:6-alpine ```添加SpringBoot配置:
``` spring: redis: host: 127.0.0.1 port: 6379 ```接口上加缓存注解即可生效:
``` @Cacheable(value = "archive", key = "root.methodName + '_' + year") public List所有优化操作可在半天内完成落地,无需额外采购硬件,也不需要修改原有业务逻辑。