要优化插入速度,请将许多小操作合并为一个大操作。理想情况下,您建立一个连接,一次发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后。
插入一行所需的时间由以下因素决定,其中数字表示大致比例:
连接:(3)
向服务器发送查询:(2)
解析查询:(2)
插入行:(1 × 行的大小)
插入索引:(1 × 索引数)
结束语:(1)
这没有考虑打开表的初始开销,这是为每个并发运行的查询完成一次。
N
假设 B 树索引,
表的大小减慢了 log 插入索引的速度。
您可以使用以下方法来加速插入:
如果同时从同一客户端插入多行,请使用
INSERT
包含多个列表的语句一次VALUES
插入多行。INSERT
这比使用单独的单行语句快得多(在某些情况下快很多倍) 。如果要将数据添加到非空表,则可以调整bulk_insert_buffer_size
变量以使数据插入速度更快。请参阅 第 5.1.7 节,“服务器系统变量”。从文本文件加载表格时,使用
LOAD DATA
. 这通常比使用INSERT
语句快 20 倍。请参阅 第 13.2.6 节,“加载数据语句”。利用列具有默认值这一事实。仅当要插入的值与默认值不同时才显式插入值。这减少了 MySQL 必须做的解析并提高了插入速度。
有关特定于表的提示, 请参阅第 8.5.5 节,“InnoDB 表的批量数据加载”
InnoDB
。有关特定于表的提示, 请参阅第 8.6.2 节,“MyISAM 表的批量数据加载”
MyISAM
。