我在树莓派(raspbian 系统)上使用 mysql 服务器来存储传感器读数。每分钟向mysql表中插入一条长度为20字节的记录。
但是 iotop 命令显示 mysqld 进程每分钟写入 200K。我想尽量减少写入 SD 卡的数据量以延长其耐用性(我已经应用了防止 SD 卡损坏的修复程序,例如用于日志和其他黑客的 tmpfs)。
为什么 mysqld 只向表中插入 20B 数据时写入 200K 字节?有没有办法在上述情况下最小化写入,调整 mysql 服务器?
有趣的是,vmstat 命令不会在“io/bo”列中显示写入磁盘的那么多数据
我使用 mysql 服务器版本 5.5.33-0+wheezy1 和 innoDB 表。
更新:
Bill 在下面的彻底回答让我意识到使用 mysql 服务器对于简单的传感器记录来说是一种矫枉过正。最终我迁移到了sqlite。对于相同的表结构,sqlite 每次事务写入的字节数(约 30kb)比 mysql 少 6 倍,这对于 RPi sd 卡来说更好。我仍在进行优化,因为正如我之前所说,我每次事务只写入 20b 的实际数据。
最佳答案
InnoDB 将记录写入 512 字节对齐的事务日志 (ib_logfile*)。它还将信息写入第一个日志的 header 。这是不可配置的,但您可以通过更改 innodb_flush_log_at_trx_commit 来降低写入频率。变量为 0。
然后修改后的页面将以 16KB 的页面写入磁盘,无论您是否只在该页面上写入了一个 20 字节的行。在 MySQL 5.6 中,您可以使用 innodb_page_size 减小页面大小变量,低至 4KB。
在写入表空间中的相应位置之前,页面也会写入双写缓冲区。您可以使用 innodb_doublewrite 禁用双写缓冲区变量。
页面也可以写入回滚段。这是不可配置的。
还有二进制日志。这与 InnoDB 具体无关,它用于任何存储引擎。如果您使用的是 Raspberry Pi,我假设您不需要二进制日志。您可以使用 log_bin 禁用二进制日志变量(只要不设置这个变量,默认条件是禁用)。
您还可以禁用一般查询日志和慢查询日志。
还有一个错误日志,但您不能禁用它。
关于mysql - 如何最小化 mysqld 写入磁盘的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818074/