MySQL 8.3 Release Notes
要优化插入速度,将多个小操作合并成一个大操作。理想情况下,您可以建立单个连接,发送多个新行的数据,然后将所有索引更新和一致性检查延迟到最后。
插入一行所需的时间由以下因素决定,其中数字表示近似比例:
-
连接:(3)
-
将查询发送到服务器:(2)
-
解析查询:(2)
-
插入行:(1 × 行大小)
-
插入索引:(1 × 索引数量)
-
关闭:(1)
这不包括打开表的初始开销,该操作对于每个并发运行的查询只执行一次。
表的大小会以 log N
的速度减慢索引的插入,假设使用 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
表的提示。