打开数据库很慢 - 性能瓶颈优化
先量化慢不慢
先搞清楚"慢"是主观感受还是客观问题:
| 数据库大小 | 正常打开时间(主密码解锁) |
|---|---|
| < 100 KB(< 50 条目) | < 1 秒 |
| 100 KB - 500 KB(50-200 条目) | 1-3 秒 |
| 500 KB - 2 MB(200-500 条目) | 2-5 秒 |
| 2 MB+(500+ 条目 / 大附件) | 3-10 秒 |
打开时间主要由 Argon2d 密钥派生函数消耗——它故意设计得慢(安全),但可以在数据库设置里调整参数。
常见慢的原因
1. Argon2d 参数太高
数据库设置 → 加密设置 → 密钥派生函数:
- 迭代次数:默认 10 次,可以降到 5 次(安全性略降但解锁快一倍)
- 内存消耗:默认 64 MB,可以降到 32 MB 或 16 MB
修改后需要重新加密整个数据库(需要输入主密码),然后保存。
建议:
- 日常数据库(daily.kdbx):迭代 5-8 次,内存 32 MB
- 高安全数据库:保持默认或更高
2. 附件太大
附件会被全部解密才能打开数据库。如果数据库里有大量附件(特别是图片或 PDF),每个附件在打开时都会被解密和处理。
优化方案:
- 清理不必要的附件
- 大附件移到单独的加密虚拟磁盘(VeraCrypt、Cryptomator)
- 附件大小控制在 5 MB 以内/个
- 总附件占比控制在数据库文件的 10-20% 以内
3. 数据库文件位置
数据库文件存在不同位置的读写速度不同:
| 位置 | 读写速度 |
|---|---|
| 手机内部存储(UFS) | 最快 |
| 高速 SD 卡(Class 10/U3) | 较快 |
| 低速 SD 卡(Class 4) | 较慢 |
| USB OTG | 取决于 USB 版本 |
| 云存储挂载目录 | 最慢(需要网络请求) |
优化:数据库文件尽量存在手机内部存储,同步用 Syncthing 等工具在后台同步,不要直接从云存储挂载目录打开。
4. 保存时触发重新加密
KeePassDX 每次保存都会重新加密整个数据库(为了内存擦除)。如果数据库很大,保存也会慢。
保存频率取决于你的条目变更频率——每改几条就保存一次是好习惯,但可以稍作调整:
- 改完一批条目再保存,而不是改一条存一条
- 手动保存(KeePassDX 自动保存间隔可调,设为 30 秒或更长)
5. 设备硬件
低端 Android 设备(骁龙 4 系、联发科 Helio P 系)的 CPU 性能有限,Argon2d 这种计算密集型函数在这些设备上自然更慢。
优化:
- 降低 Argon2d 参数(见第一条)
- 或者接受这个速度——安全还是要保证的
存储访问框架延迟
KeePassDX 通过 Android 的 Storage Access Framework(SAF)读写数据库。某些文件管理器的 SAF 实现有额外延迟:
- 系统自带文件管理器:通常最快
- Solid Explorer / FX File Explorer:较快
- 云存储 App 的文件提供者:可能有额外网络延迟
如果用云存储,先把数据库复制到本地内部存储打开,改完再同步回去——比直接从云挂载目录打开快得多。
快速优化清单
按效果从高到低排列:
- ✅ 把数据库移到手机内部存储(从云/SD 卡移出来测试)
- ✅ 降低 Argon2d 迭代次数到 5(安全性略微降低,速度翻倍)
- ✅ 清理大附件(>5 MB 的附件先移走再测试)
- ✅ 检查是否有多个数据库同时打开(虽然 KeePassDX 不支持多开,但某些同步工具可能干扰)
- ✅ 清除 KeePassDX 缓存(设置 → 应用管理 → 存储 → 清除缓存,不影响数据)