为啥 SQL 插入 (mariadb) 会随着表的增长而变慢

Posted

技术标签:

【中文标题】为啥 SQL 插入 (mariadb) 会随着表的增长而变慢【英文标题】:why are SQL inserts (mariadb) getting slower as a table grows为什么 SQL 插入 (mariadb) 会随着表的增长而变慢 【发布时间】:2021-06-10 07:50:14 【问题描述】:

我正在尝试处理一些数据并使用 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% 会更长)

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

【问题讨论】:

服务器上的swappiness也设置为0 【参考方案1】:

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

我希望这个*** post answers your question

【讨论】:

感谢您的帮助,您对重写索引的评论是原因。

以上是关于为啥 SQL 插入 (mariadb) 会随着表的增长而变慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mariadb 为使用工作台创建的 sql 文件提供语法错误

mysql表中,表的外键关联自身主键,为啥插入不了数据?

binlog2sql与MariaDB flashback

如果在 mariadb 中不存在 SQL 插入

SQL 导出表的问题?字段类型为啥会改变~

为啥C#中数据库sql语句中在表的前面加上.dbo,不加也能正常执行,两者有啥区别!