mariadb系统变量指的是什么数据,例如innodb\u log\u buffer\u size

fumotvh3  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(316)

许多mariadb系统变量定义了最大数据大小,我不清楚到底测量了哪些数据,在写操作的上下文中,我通过jdbc发送了大量数据,例如:
innodb_buffer_pool_size = 24696061952 以及
innodb_log_buffer_size = 8388608 以及
max_allowed_packet = 562036736 我使用一个基准来插入、更新或删除50000行,其中包含2mb的原始数据,即日期和双精度数据。
因此,当mariadb实现这些变量定义的限制时,它是查看发送的参数的原始值,还是同时包含所有sql字符串?
i、 e.测量简单吗

2012-01-01,0.1234
2012-01-02,0.4321
2012-01-03,0.9999
...

还是考虑sql字符串中的字节:

UPDATE data SET value = 0.1234 WHERE date = '2012-01-01'
UPDATE data SET value = 0.4321 WHERE date = '2012-01-02'
UPDATE data SET value = 0.9999 WHERE date = '2012-01-03'

在这个例子中哪个明显是2到3倍大?

7eumitmz

7eumitmz1#

innodb\日志\缓冲区\大小

它指的是内在的东西。事务记录到redo log(ib\u logfile0/ib\u logfile1)。重做日志记录被缓冲在重做日志缓冲区中,直到事务提交为止,重做日志记录的格式不会被记录,并且在版本之间也会发生更改。通过观察innodb\u os\u log\u writed状态变量的变化,可以看到日志中写入了多少内容。

MariaDB [test]> show global status like 'innodb_os_log_written';
 +-----------------------+-------+
 | Variable_name         | Value |
 +-----------------------+-------+
 | Innodb_os_log_written | 12800 |
 +-----------------------+-------+
 1 row in set (0.00 sec)

innodb\缓冲区\池\大小

数据很小,缓冲池足够大。缓冲池是innodb缓存数据的方式。如果您的数据比bufferpool大(您的情况并非如此),innodb将需要更频繁地从磁盘读取数据。所以让它保持原样,或者你可以把它变小。

允许的最大\u数据包

这只是一种安全措施,试图防止ddos攻击。如果发送非常大的数据包,它们会使服务器分配更多内存,可能会耗尽内存。但如果你不发送大数据包,服务器就不会分配很多内存,如果你不怕ddos,你可以拥有1g大小的内存。
要了解服务器端发送或接收了多少数据,可以查看状态变量

MariaDB [test]> show status like 'bytes%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Bytes_received | 570   |
| Bytes_sent     | 1716  |
+----------------+-------+
2 rows in set (0.00 sec)

这与您发送的数据大小如何对应?答案并不总是直截了当的。

未(服务器端)准备的语句

如果您只是发送未准备好的查询,那么您将发送4字节的数据包头+1字节的命令(com\u query)+您的sql查询字符串。如果查询大于16m,它将被拆分为多个数据包,每个数据包有4字节的开销。

服务器端准备的语句。

对于服务器端准备好的语句,情况更为复杂。每个数据类型都有自己的编码,所以int不能作为文本、float或日期发送。字符串仍然作为字符串发送。通常,发送的数据量会小一些(毕竟不发送sql命令,只发送数据)。

批处理特定优化

mariadb 10.2服务器和jdbc还有一个优化,可以为一个准备好的语句发送多个数据。这可以减少客户端发送的数据量(一点点),但是客户端接收的数据量会大大减少,它只是所有命令的单个数据包,而不是每个命令一个数据包。这种优化还不能用于delete。
对于不是服务器端准备的语句的批处理,jdbc还有另一个优化,它将许多类似的insert查询转换为一个multi insert,这也减少了发送和接收的字节数,但这是insert only(现在有一个任务来执行类似的删除操作)

相关问题