MySQL 8.4 Release Notes
10.2.5.1 优化插入语句
为了提高插入速度,合并多个小操作到一个大操作中。理想情况下,您可以建立单个连接,发送多行数据一次,并将所有索引更新和一致性检查延迟到最后。
插入一个行所需的时间由以下因素决定,其中数字表示近似比例:
-
建立连接:(3)
-
将查询发送到服务器:(2)
-
解析查询:(2)
-
插入行:(1 × 行的大小)
-
插入索引:(1 × 索引数量)
-
关闭连接:(1)
这不考虑每个并发运行查询对表的初始开销,这是唯一的开销。
表的大小会将插入索引的速度减慢,假设B-树索引。
您可以使用以下方法来加速插入:
-
如果您同时从同一个客户端插入许多行,可以使用多个
VALUES
列表的INSERT
语句来一次性插入多行。这比使用单独的单行INSERT
语句快得多(在某些情况下快很多)。如果您正在添加数据到非空表,可以调整bulk_insert_buffer_size
变量以使数据插入速度更快。请参阅第7.1.8节,“服务器系统变量”. -
当从文本文件加载表时,使用
LOAD DATA
。这通常比使用INSERT
语句快20倍。请参阅第15.2.9节,“LOAD DATA 语句”. -
利用列的默认值。只有在要插入的值与默认值不同时,才显式地插入值。这减少了MySQL必须执行的解析工作,并提高了插入速度。
-
请参阅第10.5.5节,“InnoDB 表的批量数据加载”,了解InnoDB表的特定提示。
-
查看第10.6.2节,“MyISAM表的批量数据加载”以获取特定于
MyISAM
表的提示。