2011-12-06 33 views
2

我正在寻找一些有MySQL专业知识的人的帮助。我不需要一个确切的解决方案 - 只是一些想法和地点寻找优化。为什么在写入300KB/sec时,I/O会写入MySQL?

有关该问题的一点点:

  • 我需要插入大量的行成一个InnoDB表。
  • 每个表只有一个索引(也是主键)
  • 每行有大约1KB的数据。
  • 我一次使用大约5000行的Load Data INFILE查询。
  • 我正在使用8个线程写入(每个写入单独的数据)。

好吧,有了这些特性,我得到的每小时写入数据库的吞吐量约为100万行。这是大约1 GB的数据或〜300KB /秒,基于连续多少数据的高端。但是,当我看着我的机器统计数据时,我注意到磁盘写入的I/O图大致以每秒20 MB的速度写入,这表明我是I/O限制。 (CPU图也发射到100%,但约90%是iowait)。所以,我的问题是,为什么MySQL将约20 MB /秒的数据写入磁盘,通过查询发送的数据量约为5 KB /秒。

我猜测这种差异是由于日志文件,临时表和事务倍增 - 但我想知道为什么这个比率接近100:1?如何将这个比例缩小到更合理的东西?什么样的内部变量导致MYSQL向磁盘写出如此多的数据而不是将其存储在内存中?例如,我已经设置了innodb_buffer_pool_size = 12G,max_heap_table_size = 8G和tmp_table_size = 6G,试图让MySQL使用更多的内存而不是磁盘 - 但仍然是相同的结果。

我很感谢您给我的任何帮助和建议!

+0

请参阅以下内容http://stackoverflow.com/questions/2463602/mysql-load-data-infile-acceleration/2504211#2504211 –

+2

这是一个更好的问题[DBA SA](http:// dba。 stackexchange.com/)或[Serverfault](http://serverfault.com)? –

+0

DBA.SE可能是一个更好的地方。其用户群似乎在增长。 – Bruno

回答

1

写作的八个线程可能太高或太低,这取决于您的存储实际的外观。

如果你在你的电脑有一个旋转金属驱动器,这是太高 - 您的驱动器将寻求各地进行写入。使用一个线程。

如果您已将数据库表碎片化为八个或更多SSD驱动器,这可能没有问题,但也许更多的线程可让您充分利用极低的“查找”延迟。 (“Seek”并不适用于较新的SSD设备,但我使用的术语与旧驱动器技术类似。)

1

我最好的猜测是,这次的90%是磁盘寻道。

如果您更新每一行的索引和事务日志,并且这些事物在物理上彼此远离,则每写入一次就会导致2-3次搜索。寻找时间大约为10ms,它将限制写作以每秒33-50行不显眼的方式。 '加载数据'不一定是这样,因为它避免了事务,但它似乎仍然更新索引。如果表空间分散,结果可能会更糟糕。多个并发线程进一步恶化了这种情况。

尝试在加载期间禁用索引。尝试使用较少的线程,可能只有一个。

声明:我不确切知道'加载数据'是如何工作的; docs from mysql.com根本不提交交易。

相关问题