mysql - 如何最小化 mysqld 写入磁盘的字节数?

标签 mysql linux raspberry-pi

我在树莓派(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/

相关文章:

python - pyodbc - 在哪里插入数据?

php - Yii 奇怪的行为 : CGridView + group + with

javascript - 陷入平均堆栈

c - 树莓派,与串口设备通信

python - gpiozero.exc.PinPWM不支持 : PWM is not supported on pin GPIO7 (Raspberry Pi 4B)

java - 错误: is not an enclosing class

linux - 创建挂载源路径时出错 '/host_mnt/c/Users/xxx/redis.conf' : mkdir/host_mnt/c/Users/xxx: permission denied

linux - python 记录器,唯一的错误是写

c - 预处理器初始化的结构体

mysql - 获取MYSQL中每个组的Top记录