为什么 SQL 插入mariadb随着表的增长而变慢 阅读写阅读写

问题描述

我正在尝试使用 django 处理一些数据并将其写入 mariadb (10.5.10) 表:

这是我的模型

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

我的问题是插入吞吐量随着表的增长而变慢(对于 8000 万行,该对象的表大约为 28GB)?

监控显示这一点(服务器仅用于 mariadb):

网络

阅读

15.2GB

2.78GB

I/O

阅读

238GB

14.9TB

问题

存储写入速度是瓶颈吗?

为什么在禁用索引和约束的情况下,mariadb 还是要向硬盘写入这么多内容

如何防止插入速度随着表的增长而下降? (我只占我需要插入的所有行的 25%,我担心最后 10% 的预期会更长)

附: 在开始之前,该表上的键也被禁用

解决方法

这是 MySQL 中的一个已知问题,部分原因是在插入新行时重写了索引,MySQL 会将行放在每个索引的位置。

我希望这stackoverflow post answers your question

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...