8.2.2 Optimizing DML Statements 优化DML 语句:
8.2.2.1 Speed of INSERT Statements
8.2.2.2 Speed of UPDATE Statements
8.2.2.3 Speed of DELETE Statements
这个章节显示 如何加速DML操作,INSERT,UPDATE和DELETE。
传统的OLTP 应用和现代的web应用通常是一些小的DML操作,
并发值至关重要的。数据分析和报表应用典型的运行DML操作一次影响很多记录,
主要的考虑是I/O 写大量的数据和保持索引的更新。对于插入和更新大量的数据
( 比如ETL, for “extract-transform-load”),
有时候你使用其他的SQL语句或者外部命令,模拟INSERT,UPDATE和DELETE 语句。
8.2.2.1 Speed of INSERT Statements
要优化插入速度,将小的操作合成一个小的大操作。在理想状况下,
你再一个单独的连接上, 一次发送很多数据, delay所有的索引更新和一致性检查直到结束。
插入一行需要的时间是有下面的因素决定, number 表示相应的比例:
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 语句带多个VALUES 列表
来一次插入多行。
这个认为是快速的(快很多倍在有些情况下) 相比使用单独的行插入语句。
如果你增加数据到一个非空的表,你可以调优bulk_insert_buffer_size 变量来让数据插入变的更快。
当从文本文件加载表, 使用LOAD DATA 文件, 这个通常是20倍速度的相比使用INSERT 语句。
利用列有默认值的事实,只有当插入的值于默认的值不同的时候才插入值,
这个降低了SQL的解析,来改善性能。