优化数据更改语句(insert、update、delete)
这部分解释了如何加快数据更改语句:INSERT
,UPDATE
,和DELETE
。传统的OLTP应用程序和现代Web应用程序通常会执行许多小数据更改操作,而这些操作对并发至关重要。数据分析和报告应用程序通常运行会同时影响许多行的数据更改操作,其中主要考虑因素是I / O以写入大量数据并保持索引为最新。为了插入和更新大量数据(在业界称为ETL,即“ extract-transform-load ”),有时您会使用其他SQL语句或外部命令来模拟INSERT
,UPDATE
和DELETE
语句。
优化 INSERT 语句
为了优化插入速度,请将许多小操作合并为一个大操作。理想情况下,您进行单个连接,一次发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后。
插入行所需的时间由以下因素决定,其中数字表示近似比例:
- 连接:(3)
- 向服务器发送查询:(2)
- 解析查询:(2)
- 插入行:(1×行大小)
- 插入索引:(1×索引数)
- 闭幕:(1)
这没有考虑到打开表的初始开销,该开销对于每个同时运行的查询都执行一次。
N
假设B树索引,表的大小会减慢按log插入索引的速度。
您可以使用以下方法来加快插入速度:
- 如果要同时从同一客户端插入许多行,请使用
INSERT
具有多个VALUES
列表的语句一次插入几行。这比使用单独的单行INSERT
语句要快得多(某些情况下要快很多倍)。如果要将数据添加到非空表,则可以调整bulk_insert_buffer_size
变量以使数据插入更快。请参见“服务器系统变量”。 - 从文本文件加载表格时,请使用
LOAD DATA
。这通常比使用INSERT
语句快20倍。请参见“ LOAD DATA语句”。 - 利用列具有默认值的事实。仅当要插入的值与默认值不同时才明确插入值。这减少了MySQL必须执行的解析,并提高了插入速度。
- 有关特定于表的提示,请参见“InnoDB表批量插入数据”
InnoDB
。 - 有关特定于表的提示,请参见“MyISAM表批量插入数据”
MyISAM
。
优化 UPDATE 语句
优化了更新语句SELECT
,使其像查询一样具有额外的写开销。写入速度取决于要更新的数据量和要更新的索引数。不变的索引不会更新。
获得快速更新的另一种方法是延迟更新,然后在以后连续进行许多更新。如果锁定表,一起执行多个更新要比一次执行一次更新快得多。
对于MyISAM
使用动态行格式的表,将行更新为更长的总长度可能会拆分该行。如果您经常这样做,那么OPTIMIZE TABLE
偶尔使用非常重要。请参见“ OPTIMIZE TABLE语句”。
优化 DELETE 语句
删除MyISAM
表中单个行所需的时间与索引数成正比。若要更快地删除行,可以通过增加key_buffer_size
系统变量来增加键高速缓存的大小。请参见“配置服务器”。
要删除MyISAM
表中的所有行,速度比快。截断操作不是事务安全的;在活动事务或活动表锁定过程中尝试执行一个错误时发生错误。请参见“ TRUNCATE TABLE语句”。TRUNCATE TABLE tbl_name
DELETE FROM tbl_name