2作者: hashmak_jsn2 个月前原帖
我们最近在树莓派上对基于RocksDB构建的轻量级嵌入式数据库AnuDB与SQLite进行了基准测试。尤其是在并行操作方面,性能差异非常显著。 <p>GitHub链接:</p> AnuDB基准测试:<a href="https://github.com/hash-anu/AnuDBBenchmark">https://github.com/hash-anu/AnuDBBenchmark</a> <p>AnuDB(核心):<a href="https://github.com/hash-anu/AnuDB">https://github.com/hash-anu/AnuDB</a></p> <p>为什么要比较AnuDB和SQLite?</p> SQLite在许多嵌入式用例中表现出色——它简单、经过考验且极其可靠。但在需要并行性或并发写入时,它的扩展性较差。 <p>AnuDB基于RocksDB构建,开箱即用提供了更好的并发性。我们希望通过在树莓派上使用真实基准测试来衡量实际差异。</p> <p>基准测试设置</p> 平台:树莓派2(ARMv7)<br> 基准测试操作:插入、查询、更新、删除、并行<br> AnuDB使用RocksDB和MsgPack序列化<br> SQLite使用原始数据,并启用WAL模式以确保公平性<br> <p>关键结果</p> 插入:<br> AnuDB: 448 ops/sec<br> SQLite: 838 ops/sec<br> 查询:<br> AnuDB: 54 ops/sec<br> SQLite: 30 ops/sec<br> 更新:<br> AnuDB: 408 ops/sec<br> SQLite: 600 ops/sec<br> 删除:<br> AnuDB: 555 ops/sec<br> SQLite: 1942 ops/sec<br> 并行(10线程):<br> AnuDB: 412 ops/sec<br> SQLite: 1.4 ops/sec (!)<br> 在并行情况下,AnuDB的速度比SQLite快了279倍以上。 <p>为什么会有如此巨大的并行差异?</p> 即使在WAL模式下,SQLite也使用全局数据库级锁。它并不是为高并发场景设计的。 <p>RocksDB(用于AnuDB)支持:</p> 细粒度锁定<br> 并发读/写<br> 使用LSM树架构实现更好的并行性<br> 这解释了为什么在多线程工作负载下,AnuDB显著优于SQLite。 <p>亲自尝试一下</p> 克隆代码库:<br> git clone <a href="https://github.com/hash-anu/AnuDBBenchmark">https://github.com/hash-anu/AnuDBBenchmark</a><br> cd AnuDBBenchmark<br> ./build.sh /path/to/AnuDB /path/to/sqlite<br> ./benchmark<br> 结果将保存到benchmark_results.csv。 <p>何时使用AnuDB</p> 如果您需要高并发的嵌入式存储,处理遥测、传感器数据或并行工作负载,或者希望在负载下比SQLite更轻量和更快,请使用AnuDB。 <p>如果您需要SQL兼容性,重视成熟的生态系统/工具,请继续使用SQLite。</p> <p>欢迎反馈</p> 这是一项早期实验。我们正在积极开发AnuDB,并希望获得反馈:<br> 我们的基准测试公平吗?<br> 我们还可以在哪里进一步优化?<br> 这对您的嵌入式项目有用吗?