bulk_insert_buffer_size 和 InnoDB

Rej*_*jah 3 mysql innodb myisam

我在此页面上阅读了以下内容

http://dev.mysql.com/doc/mysql/en/server-system-variables.html

bulk_insert_buffer_size MyISAM 使用特殊的树状缓存来使 INSERT ... SELECT、INSERT ... VALUES (...)、(...)、... 和 LOAD DATA INFILE 的批量插入更快。此变量以每个线程的字节数限制缓存树的大小。将其设置为 0 将禁用此优化。注意:此缓存仅在向非空表添加数据时使用。默认值为 8MB。这个变量是在 MySQL 4.0.3 中添加的。这个变量以前被命名为 myisam_bulk_insert_tree_size。

我认为这意味着 bulk_insert_buffer_size 对 InnoDB 表没有影响,只对 MyISAM 表有影响。这样对吗?

Rol*_*DBA 7

是的,你是对的。我之前写过这个:如何优化这个需要保存 5+ 百万行的 mySQL 表?

在批量加载 InnoDB 表时,最常被忽略的禁用设置之一是innodb_doublewrite

InnoDB 架构

InnoDB 架构

请注意系统表空间文件内的双写缓冲区ibdata1。每次将 16K 页写入 InnoDB 表或事务日志时,该页首先写入双写缓冲区。您需要做的就是禁用它,加载您的数据,然后重新启用它。

步骤 01:禁用快速关机

mysql -uroot -p... -ANe"SET GLOBAL innodb_fast_shutdown = 0"
Run Code Online (Sandbox Code Playgroud)

步骤 02:在没有双写缓冲区的情况下重新启动 mysql

service mysql restart --innodb-doublewrite=0
Run Code Online (Sandbox Code Playgroud)

步骤 03:加载 InnoDB 数据

步骤 04:重启 mysql

service mysql restart
Run Code Online (Sandbox Code Playgroud)

警告

您也可以禁用外键检查和唯一检查。任何标准的 mysqldump 都已经为你做到了。