5000年前的数据库:比现代数据库更可靠?

2025-09-06

一张5000年前苏美尔文明的数据库图片引发了作者对数据库日期存储上限的思考。图片展示了公元前3100年记录大麦和麦芽的数据库,其可靠性远超现代数据库。测试发现,MySQL无法存储公元前4713年之前的日期,而PostgreSQL和SQLite则可以。这引发了作者对如何存储更早日期的思考,例如博物馆文物记录等,并提出了使用纪元时间戳或自定义系统等方案。

阅读更多
(avi.im)
开发

数据库能否完全取代缓存?

2025-08-31

本文探讨了数据库能否完全取代缓存的可能性。作者认为,虽然数据库已具备部分缓存功能,例如内存缓冲池和读副本,但缓存仍然在低延迟数据访问方面具有优势,尤其是在处理特定数据子集和预计算数据方面。数据库要取代缓存,需要解决几个关键问题:高效处理大量读副本、实现部分数据读副本、支持数据优先级设置以及高效的增量视图维护机制。作者认为,结合增量视图维护和部分读副本技术,未来数据库有可能部分取代缓存,但目前仍有差距。

阅读更多
(avi.im)
开发 读副本

SQLite WAL 模式下的同步性与数据持久性权衡

2025-08-24

SQLite的WAL模式(默认是journal模式)为了提高写入吞吐量,牺牲了一定的数据持久性。同步模式pragma控制fsync的调用方式,默认为NORMAL。在这种模式下,WAL文件在每个检查点之前同步,数据库文件在每个检查点完成后同步,但大多数事务期间不进行同步操作。如果持久性不是问题,NORMAL模式足以满足WAL模式下的需求。若需在每次提交时调用fsync,则应将同步模式设置为FULL,这会在每次事务提交后额外同步WAL文件,提高数据持久性,但会降低写入速度。有人质疑SurrealDB在基准测试中为了更好的结果而牺牲了数据持久性,这篇文章以此为例解释了SQLite中的相关机制。

阅读更多
(avi.im)

SQLite WAL模式下的校验和问题:数据丢失的隐患

2025-07-25

本文探讨了SQLite数据库在WAL模式下校验和机制的缺陷。当WAL文件中的某个帧校验和错误时,SQLite并非报错,而是直接丢弃该帧及其后续所有帧,即使这些帧可能并未损坏。这种设计虽然并非Bug,但会导致数据丢失。作者分析了其原因,并建议SQLite应在检测到损坏时抛出错误,而不是默认丢弃数据,以提供更好的数据完整性。

阅读更多
(avi.im)
开发

SQLite:一个不可思议的数据库传奇

2024-12-30

SQLite,这个全球部署最广泛的数据库,由三人团队维护,拒绝外部贡献,却以其非凡的性能和稳定性征服了世界。它诞生于一艘美国军舰,旨在解决服务器宕机问题,如今已成为数万亿数据库的基石。SQLite并非开源,而是公有领域软件,拥有比开源许可更少的限制。其严格的测试流程,甚至包括模拟操作系统崩溃等极端情况,保证了其超高的可靠性。然而,其独特的商业模式——通过付费支持和会员制获得收入——也引人注目。SQLite的传奇故事,不仅在于其技术实力,更在于其背后的坚持和创新。

阅读更多
(avi.im)
开发 传奇

布隆过滤器:SQLite性能提升十倍的秘密

2024-12-22

研究人员巧妙地利用布隆过滤器,将SQLite分析查询速度提升了十倍。他们发现SQLite的嵌套循环连接效率低下,大量时间消耗在B树探测上。通过在连接操作前使用布隆过滤器,先快速筛选出可能匹配的行,再进行B树探测,显著减少了探测次数。布隆过滤器内存占用小,易于集成到SQLite现有查询引擎中,最终实现了显著的性能提升,这一成果已应用于SQLite 3.38.0版本。

阅读更多
(avi.im)
开发

Rust重写SQLite:Limbo项目实现100倍尾部延迟降低

2024-12-16

芬兰赫尔辛基大学和剑桥大学的研究人员通过使用异步I/O和io_uring技术,以及存储解耦,对SQLite进行了Rust重写,创建了名为Limbo的项目。该项目显著提升了SQLite的性能,在多租户无服务器运行环境下,尾部延迟降低了高达100倍。研究人员通过替换同步字节码指令为异步指令,实现了异步I/O,从而避免了阻塞,提高了并发性。Limbo的改进主要体现在高百分位延迟的改善上,这对于需要高可靠性的应用至关重要。

阅读更多
(avi.im)
开发 Limbo

使用 S3 构建分布式日志(不到 150 行 Go 代码)

2024-12-01

本文介绍了如何使用 S3 构建一个持久、分布式且高可用的日志。该日志将每条记录作为对象存储在 S3 中,并利用 S3 的条件写入特性确保每条记录拥有唯一的、递增的偏移量。文章详细讲解了日志的追加和读取操作的实现,以及如何通过校验和保证数据完整性。此外,还讨论了节点故障后的恢复机制,通过查找最后一个插入的对象来确定日志的当前长度。代码已开源,并提出了一些待解决的问题,例如优化 LastRecord 方法、添加缓存、批量写入和缓冲写入等。

阅读更多
(avi.im)
12
未分类 分布式日志

SQLite数据库的校验和问题

2024-11-09

SQLite数据库默认不执行校验和,这意味着磁盘损坏时数据库或应用程序无法识别。即使单个比特位翻转也可能导致严重问题,例如Alice账户余额被清零。虽然SQLite的WAL帧具有校验和,但检测到损坏帧时,它会默默忽略错误帧及其后续帧,甚至不报错。可以使用校验和VFS Shim,但前提是数据库的预留字节值为8。这意味着如果使用了任何其他预留字节的扩展,则无法使用校验和Shim。

阅读更多
(avi.im)
20
未分类