这部分解释了如何加快数据操纵语言(DML)语句,INSERT,UPDATE和DELETE。传统的OLTP应用程序和现代Web应用程序通常做很多小DML操作,数据分析和报告应用程序通常运行 DML操作影响许多行一次,这里主要考虑的是数据大量的I / O写和保持索引向上的更新。对于插入和更新大量数据(业内称为ETL称,对于“抽取,转换,加载”),有时候你使用其他SQL语句或外部命令,模仿INSERT,UPDATE,和DELETE语句的影响。
8.2.2.1. Speed of INSERT Statements(INSERT语句的速度)
为了优化插入速度,结合许多小操作成一个大的操作。理想情况下,你做单一连接,一次的数据发送许多新行,并延缓所有的索引更新和一致性检查,直到最后一刻。所需的插入行的时间由以下因素的影响,其中的数字表示大致的比例确定:
-
Connecting: (3)
-
Sending query to server: (2)
-
Parsing query: (2)
-
Inserting row: (1 × size of row)
-
Inserting indexes: (1 × number of indexes)
-
Closing: (1)
这不考虑初始开销打开表,这是做一次每个并发运行的查询。表的大小减慢通过为log N索引的插入,假设B树索引。
您可以使用下面的方法来加快插入:
-
如果你是在同一时间插入来自同一客户多行,使用INSERT语句有多个值列出同时插入几行。这是相当快(在 某些情况下快许多倍)比使用单独的单行INSERT语句。如果要添加数据到非空表,可以调整bulk_insert_buffer_size[493]变量,使数据插入更快。详见 Section 5.1.4, “Server System Variables”。
-
当从一个文本文件加载一个表时,使用LOAD DATA INFILE。这通常比使用INSERT语句快20倍。详见 Section 13.2.6, “LOAD DATA INFILE Syntax”。
-
采取的这一事实列有默认值的优势。只有当插入的值不同于默认值明确地插入值。这降低了分析该MySQL必须做的并提高插入速度。
-
InnoDB表具体技巧详见 Section 8.5.4, “Bulk Data Loading for InnoDB Tables”。
-
MyIASM表具体技巧详见 Section 8.6.2, “Bulk Data Loading for MyISAM Tables”
8.2.2.2. Speed of UPDATE Statements(UPDATE语句的速度)
一个UPDATE语句进行优化像一个写的额外开销SELECT查询。写的速度取决于数据被更新的数量和已更新的索引数。未改变索引没有得到更新。
另一种方式来获得快速更新是后来推迟更新,然后做在一行许多更新。执行多次更新在一起比做一次快得多如果你锁定表。对于MyISAM表使用动态行格式,更新的行为更长的总长度可以分割行。如果你经常这样做,这是非常重要的是使用OPTIMIZE TABLE偶尔。
8.2.2.3. Speed of DELETE Statements(DELETE语句的速度)
删除一个MyISAM表的各个行所需要的时间是完全成比例的索引数。为了更快速地删除行,你可以通过增加key_buffer_size[520]系统变量增加索引缓存的大小。详见 Section 8.11.2, “Tuning Server Parameters”。
从MyISAM表中删除所有行,TRUNCATE TABLE tbl_name比DELETE FROM tbl_name快。截断操作不是安全事务;尝试之一活动事务或活动表锁的过程中发生错误时。详见 Section 13.1.27, “TRUNCATE TABLE Syntax”。