InnoDB插入速度更快


8

我是与Mondrian OLAP一起研究OLAP的研究生。所以我想在初始加载时更快地将数据插入InnoDB(MySQL 5.5)。在这种环境下,唯一的用户就是我,因此我认为可以允许对插入速度进行更多宽松的设置。目前,我正在使用以下技术。

  • 禁用 log_bin
  • 使能 skip-innodb-doublewrite
  • 设置transaction_isolationREAD-COMMITTEDREAD-UNCOMMITTED(实际上READ-COMMITED
  • 设置innodb_flush_log_at_trx_commit02(实际上0
  • 设置innodb_buffer_pool_size为5GB(系统具有6GB RAM)

还有其他技术可以在InnoDB上更快地插入吗?而我不得不修改innodb_io_read_threadinnodb_io_write_thread?如果您需要更多信息,请告诉我。

Answers:


9

建议#1

如果您的计算机具有多个核心,则需要增加以下内容:

[mysqld]
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000

这些是什么?

建议#2

为了从系统表空间(ibdata1)中分离数据和索引,您需要执行InnoDB的完整重组。听起来很复杂,但是非常简单。我在DBA StackExchange(2012年8月29日)StackOverflow(2010年10月29日)中写道。基本步骤是

  • SET GLOBAL innodb_fast_shutdown = 0;
  • mysqldump所有数据到SQL转储
  • service mysql stop
  • 删除以下文件
    • ibdata1
    • ib_logfile0
    • ib_logfile1
  • service mysql start

在运行之前service mysql start,将此行添加到my.cnf

innodb_open_files=32768

这样,将有专用于每个单独表的文件句柄。默认值为300。已知已缓存文件句柄。如果将其设置得很高并迅速达到最高点,将会使速度降低。如果您正在处理少量表,则情况并非如此。


谢谢您的建议。我会尽力的建议#2,现在,我要调整innodb_read_io_threadsinnodb_write_io_threads和`innodb_io_capacity”。
inohiro

“删除下列文件ibdata1” Sheesh,没有警告。
magallanes

6

有一个完整的文档致力于将数据批量加载到InnoDB中。要点:

  1. 禁用自动提交以避免对每个插入语句进行额外的日志刷新: SET autocommit=0;...sql import;COMMIT;
  2. 禁用外部检查和唯一检查(您不能完全禁用所有索引):

    SET unique_checks=0;
    SET foreign_key_checks=0;
  3. 可能将innodb_autoinc_lock_mode设置为2,而不是1(默认值)。是有关此设置的文档。

第三个可能对您有帮助,也可能没有帮助,因此我建议您阅读该链接以了解最初如何加载数据。例如,如果您将负载分成多个插入以同时运行,则绝对可以帮助您将值设置为2。帮帮我。

由于您正在为该初始插入打开二进制日志,因此您不必在意自动递增编号的间隔(如果是同时插入)。


谢谢您的回答!批量插入看起来太快了,我稍后再试。
inohiro

仅将autocommit = 0设置就可以将吞吐量提高几个数量级。谢谢!
Alex Barker

1

您可以使用以下方法来加快插入速度:

  • 如果要同时从同一客户端插入许多行,请使用INSERT具有多个VALUES列表的语句一次插入几行。这比使用单独的单行INSERT语句要快得多(某些情况下要快很多倍)。如果要将数据添加到非空表,则可以调整bulk_insert_buffer_size变量以使数据插入更快。
  • 从文本文件加载表格时,请使用LOAD DATA INFILE。这通常比使用INSERT语句快20倍。看到
  • 利用列具有默认值的事实。仅当要插入的值与默认值不同时才明确插入值。这减少了MySQL必须执行的解析,并提高了插入速度。
  • 有关特定于InnoDB表的提示,请参见第9.5.5节“ 为InnoDB表加载大数据 ”。

0

计划A:“批量” INSERT-每个INSERT语句多行。建议每个语句大约1000行。autocommit = on,没有明确的BEGIN ... COMMIT

方案B:LOAD DATA

如果一次插入太多行,InnoDB必须做更多的工作才能在发生崩溃时回滚插入。因此,我不同意autocommit = off,它将整个集合放入单个事务中。

整个行集的LOAD DATA可能会有相同的问题,但是速度非常快。

buffer_pool = 6G中的5G即将过大。如果有任何交换,性能将下降。

分区可能会使它变慢。

显示创建表-辅助键可能是一个严重的障碍。

您在使用InnoDB吗?还是XtraDB?


谢谢您的回答。我正在使用InnoDB。我喜欢计划A LOAD DATA而不是计划B。看起来这么快,但是我们需要立即将数据以CSV格式写入文本,然后使用LOAD DATA对吗?/我将其设置buffer_pool_size为4GB。
inohiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.