我的RaspberryPi每5分钟读取一次温度/气压传感器,并将数据和时间戳写入CSV文件。每次大约25个字节。
我也将数据写入mySQL数据库(MariaDB,InnoDB)作为实验,因为这允许简单的查询,来自不同进程的数据访问等等。为了更快地访问,时间戳是主键。
原则上,时间戳是4个字节,每个值4个字节浮点数,所以总共大约12个字节。当然,数据组织还有一些字节,但是iotop -Pa
,我发现每隔5分钟,大约180kB被写入磁盘。即使在考虑日记时,也是如此,并且可能是时间戳是主键。
有谁知道数据库在做什么?也许,是否有任何调整可以减少这种情况?
我担心数据被反复覆盖,虽然数据库驻留在USB闪存驱动器而不是内部SD卡上,但这会很快耗尽驱动器。 (是的,我知道,这种媒体上的数据库并不是一个好主意,但我没想到情况会更糟)
答案 0 :(得分:1)
对于每次事务提交,MySQL都会将记录写入InnoDB redo log。即使行大小较小,写入大小也至少为512字节。您可以通过将更改分组到事务中来减少写入(请参阅https://www.percona.com/blog/2012/10/08/measuring-the-amount-of-writes-in-innodb-redo-logs/)。
您还可以将MySQL设置为在提交时推迟写入重做日志文件。如果您的设备在提交的事务到达磁盘之前崩溃,则存在丢失数据的风险。
MySQL也可以写入其二进制日志,如果你已经启用了(你可能不在这样的设备上,但你应该检查)。
当需要将已更改的页面从RAM刷新到磁盘时,首先将MySQL写入“双写段”,然后将实际页面写入磁盘上各自的位置。这是为了防止在页面写入期间崩溃,这可能会破坏您的数据库。如果您更关心减少写入I / O而不是风险,则可以禁用双写活动(但以后在数据库损坏时不要再抱怨)。
binlog
,如果设置了innodb_doublewrite=0
innodb_flush_log_at_trx_commit=0
另见http://www.tocker.ca/2013/11/04/reducing-mysql-durability-for-testing.html