这些性能提示补充了第 8.2.4.1 节“优化 INSERT 语句”中快速插入的一般准则。
将数据导入
InnoDB
时,关闭自动提交模式,因为它会为每次插入执行日志刷新到磁盘。要在导入操作期间禁用自动提交,请用SET autocommit
andCOMMIT
语句将其括起来:SET autocommit=0; ... SQL import statements ... COMMIT;
mysqldump选项
--opt
创建可以快速导入到表中的转储文件 ,即使不使用and 语句InnoDB
包装它们也是如此 。SET autocommit
COMMIT
如果您
UNIQUE
对辅助键有限制,您可以通过在导入会话期间暂时关闭唯一性检查来加速表导入:SET unique_checks=0; ... SQL import statements ... SET unique_checks=1;
对于大表,这可以节省大量的磁盘 I/O,因为
InnoDB
可以使用它的更改缓冲区来批量写入二级索引记录。确保数据不包含重复键。如果您
FOREIGN KEY
的表中有约束,您可以通过在导入会话期间关闭外键检查来加速表导入:SET foreign_key_checks=0; ... SQL import statements ... SET foreign_key_checks=1;
对于大表,这可以节省大量磁盘 I/O。
INSERT
如果需要插入多行, 请使用多行语法来减少客户端和服务器之间的通信开销:INSERT INTO yourtable VALUES (1,2), (5,5), ...;
此技巧适用于插入任何表,而不仅仅是
InnoDB
表。当对具有自动增量列的表进行批量插入时,设置
innodb_autoinc_lock_mode
为 2 而不是默认值 1。有关详细信息,请参阅 第 14.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”。When performing bulk inserts, it is faster to insert rows in
PRIMARY KEY
order.InnoDB
tables use a clustered index, which makes it relatively fast to use data in the order of thePRIMARY KEY
. Performing bulk inserts inPRIMARY KEY
order is particularly important for tables that do not fit entirely within the buffer pool.For optimal performance when loading data into an
InnoDB
FULLTEXT
index, follow this set of steps:Define a column
FTS_DOC_ID
at table creation time, of typeBIGINT UNSIGNED NOT NULL
, with a unique index namedFTS_DOC_ID_INDEX
. For example:CREATE TABLE t1 ( FTS_DOC_ID BIGINT unsigned NOT NULL AUTO_INCREMENT, title varchar(255) NOT NULL DEFAULT '', text mediumtext NOT NULL, PRIMARY KEY (`FTS_DOC_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
Load the data into the table.
Create the
FULLTEXT
index after the data is loaded.
Note在创建表时添加
FTS_DOC_ID
列时,请确保在 更新索引列FTS_DOC_ID
时更新该 列,因为必须随着每个 或 单调增加。如果您选择不在表创建时添加 at 并为您管理 DOC ID,请在下次调用时将其添加 为隐藏列。但是,这种方法需要重建表,这会影响性能。FULLTEXT
FTS_DOC_ID
INSERT
UPDATE
FTS_DOC_ID
InnoDB
InnoDB
FTS_DOC_ID
CREATE FULLTEXT INDEX