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