InnoDB 插入速度更快

ino*_*iro 10 mysql innodb insert mysql-5.5

我是一名研究生,正在使用 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吗?如果您需要更多信息,请告诉我。

Rol*_*DBA 12

建议#1

如果你的机器有多个核心,则需要增加以下内容:

[mysqld]
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
Run Code Online (Sandbox Code Playgroud)

这些是什么?

建议#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
Run Code Online (Sandbox Code Playgroud)

这样,就会有专用于每个单独表的文件句柄。默认值为 300。已知文件句柄会被缓存。如果您将其设置得非常高并迅速达到上限,那么速度将会放缓。如果您正在处理少量表,情况就不应该如此。


Der*_*ney 6

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

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

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

第三个可能对您有帮助,也可能没有帮助,因此我建议您阅读该链接以了解您最初是如何加载数据的。例如,如果您将负载分解为多个插入以并发运行,那么将值设置为 2 肯定会帮助您。如果您正在执行一个大型多行插入,它不会做太多(如果有的话)帮助。

由于您正在为这个初始插入转换二进制日志,因此您不应该关心自动增量数字中的差距(如果进行并发插入)。