SQLite tips:
1.
https://www.sqlite.org/wal.htmlpragma journal_mode = wal,这个简直是必须的,坏处非常微小,而会让你的数据库可以同时有任意多个只读事务外加一个读写事务。
2.
https://www.sqlite.org/stricttables.html可以把所有表都创建成 strict table,其中明确想保存自由类型的列用 any 类型就行。
3. 默认配置下,删除大量数据后,只能通过 vacuum 来释放不再需要的空间,它的原理是完全复制一份新数据库,再删除旧的,在磁盘很满时做不了。可以看一下自己删数据时用的连接是不是 pragma secure_delete = 1 的(或者先设置这个再删),如果是,就有一个巧妙的做法:确保停掉所有数据库连接,然后对数据库文件做 fallocate -d。这会把删掉的数据的位置都挖成洞,过程中不额外占用空间,并且业务中断时间也短得多。
pragma secure_delete = 1 的效果是把删除的数据都用 0 覆写,如果想让删除的性能更高,也可以关掉这一功能。
想方便地回收空间的话,标准做法是在创建任何表之前,先为数据库设置 pragma auto_vacuum = 1 或 2(详见文档),这会使数据库记录每个页面被引用的位置,使得空白页面可以和尾部的非空白页面交换,然后再 truncate。唉,要是 SQLite 能在可打洞的文件系统上用打洞来删除数据,secure_delete 和 auto_vacuum 的效果就都可以更低开销地实现了。