数据库的大字段放前面为什么会导致10倍的性能差?

在 SQLite3 数据库里面存了比较大的二进制数据,后面又追加了一个小字段数据到最后。 一个现象是:查询此大二进制数据前面和后面字段竟然有 10 倍的性能差距(前者性能更好)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ time echo 'select id,digest from files' | sqlite3 files.db > /dev/null 

real    0m0.010s
user    0m0.003s
sys     0m0.005s

$ time echo 'select id,digest from files' | sqlite3 files_2.db > /dev/null 

real    0m0.146s
user    0m0.043s
sys     0m0.101s

本地非冷启动测试,取了多次测试的结果,均如上。服务器上能夸张到几秒到几分钟的差异。

差不多 1500 条数据,升级服务器的数据库居然花了七分钟,这能忍?

1
2
3
4
5
6
2025/04/22 12:05:05 main.go:50: updating to DB version 49 ...
2025/04/22 12:05:05 versions.go:600: 删除索引并创建备份表……
2025/04/22 12:05:05 versions.go:603: 正在拷贝旧数据到新表……
2025/04/22 12:09:24 versions.go:605: 正在删除旧表……
2025/04/22 12:12:46 versions.go:607: 重命名新表为旧表……
2025/04/22 12:12:46 versions.go:609: 创建新的索引……

当然,升级后服务器也降到了 0.1 秒内。

奇奇怪怪。

碎碎念 桃子