为什么 SQL 插入(mariadb)随着 table 的增长而变慢
why are SQL inserts (mariadb) getting slower as a table grows
我正在尝试处理一些数据并将其写入 mariadb (10.5.10) table 使用 django :
这是我的模型
class AbstractCandle(models.Model):
exchanged_security = models.ForeignKey('market.exchangedsecurity', on_delete=models.CASCADE)
date = models.DateTimeField(db_index=True)
duration = models.DurationField(db_index=True)
ask_open = models.FloatField(default=-1, db_index=True)
ask_high = models.FloatField(default=-1, db_index=True)
ask_low = models.FloatField(default=-1, db_index=True)
ask_close = models.FloatField(default=-1, db_index=True)
class Meta:
unique_together = [('exchanged_security', 'date', 'duration')]
abstract = True
我对 mariadb 进行了一些调整以使其更快:
innodb_compression_algorithm=none
innodb_autoinc_lock_mode=2
innodb_buffer_pool_size=1024M
max_allowed_packet=1024M
innodb-log-buffer-size=512M
wait_timeout=28800
unique_checks=0
innodb_flush_log_at_trx_commit=0
foreign_key_checks=0
sync_binlog=0
我的问题是,随着 table 的增长,插入吞吐量越来越慢(对于 8000 万行,该对象的 table 约为 28GB)?
监控显示(服务器仅用于 mariadb):
网络
阅读
15.2GB
写
2.78GB
屏蔽I/O
阅读
238GB
写
14.9TB
问题
存储写入速度是瓶颈吗?
即使我禁用了索引和约束,为什么 mariadb 会向硬盘写入这么多东西?
如何在 table 增长时保持插入速度不下降? (我只需要插入所有行的 25%,我担心最后 10% 的预期时间会更长)
PS :
在开始
之前,table 上的键也被禁用
这是 MySQL 中的一个已知问题,部分原因是在插入新行时重写索引,MySQL 将行放在每个索引的位置。
希望这个Whosebug post answers your question
我正在尝试处理一些数据并将其写入 mariadb (10.5.10) table 使用 django :
这是我的模型
class AbstractCandle(models.Model):
exchanged_security = models.ForeignKey('market.exchangedsecurity', on_delete=models.CASCADE)
date = models.DateTimeField(db_index=True)
duration = models.DurationField(db_index=True)
ask_open = models.FloatField(default=-1, db_index=True)
ask_high = models.FloatField(default=-1, db_index=True)
ask_low = models.FloatField(default=-1, db_index=True)
ask_close = models.FloatField(default=-1, db_index=True)
class Meta:
unique_together = [('exchanged_security', 'date', 'duration')]
abstract = True
我对 mariadb 进行了一些调整以使其更快:
innodb_compression_algorithm=none
innodb_autoinc_lock_mode=2
innodb_buffer_pool_size=1024M
max_allowed_packet=1024M
innodb-log-buffer-size=512M
wait_timeout=28800
unique_checks=0
innodb_flush_log_at_trx_commit=0
foreign_key_checks=0
sync_binlog=0
我的问题是,随着 table 的增长,插入吞吐量越来越慢(对于 8000 万行,该对象的 table 约为 28GB)?
监控显示(服务器仅用于 mariadb):
网络
阅读
15.2GB
写
2.78GB
屏蔽I/O
阅读
238GB
写
14.9TB
问题
存储写入速度是瓶颈吗?
即使我禁用了索引和约束,为什么 mariadb 会向硬盘写入这么多东西?
如何在 table 增长时保持插入速度不下降? (我只需要插入所有行的 25%,我担心最后 10% 的预期时间会更长)
PS : 在开始
之前,table 上的键也被禁用这是 MySQL 中的一个已知问题,部分原因是在插入新行时重写索引,MySQL 将行放在每个索引的位置。
希望这个Whosebug post answers your question