<分区>
我正在向具有 MySQL 专业知识的人寻求帮助。我不需要一个确切的解决方案 - 只是一些想法和寻找优化的地方。
关于问题的一点点:
- 我需要将大量行插入到 InnoDB 表中。
- 每个表只有一个索引(也是主键)
- 每行大约有 1KB 的数据。
- 我正在使用一次约 5000 行的加载数据 INFILE 查询。
- 我使用 8 个线程进行写入(每个写入单独的数据)。
好的,有了这些特性,我的数据库写入吞吐量约为每小时 100 万行。这大约是 1 GB 的数据或 ~300KB/秒,基于一行中数据量的上限。
但是,当我查看我的机器统计信息时,我注意到磁盘的 I/O 图以大约 20 MB/秒的速度写入平坦线,这表明我受 I/O 限制。 (CPU 图也达到 100%,但其中约 90% 是 iowait)。所以,我的问题是,当通过查询发送的数据量约为 5 KB/秒时,为什么 MySQL 会以大约 20 MB/秒的速度将数据写入磁盘。
我猜测差异是由日志文件、临时表和事务加倍引起的 - 但我想知道为什么这个比率接近 100:1?以及如何将这个比例缩小到更合理的水平?什么样的内部变量导致 MYSQL 将如此多的数据写出到磁盘而不是将其存储在内存中?例如,我已经设置了 innodb_buffer_pool_size = 12G、max_heap_table_size = 8G 和 tmp_table_size = 6G,试图让 MySQL 使用更多内存而不是磁盘 - 但结果仍然相同。
非常感谢您能给我的任何帮助和建议!