Mysql优化(出自官方文档) - 第七篇
Mysql优化(出自官方文档) - 第七篇
Optimizing Data Change Statements
主要涉及到三种操作:INSERT, UPDATE
和DELETE
1 Optimizing INSERT Statements
尽量将多次小操作合并为,这样子,就只会产生一次连接并且数据一次性发给服务器, 而且,也只有在操作最后才会进行索引更新和一致性检查。
根据预估,通常来讲,一次插入操作所耗费的时间比例如下:
- 网络连接(3)
- 发送请求给服务器(2)
- 解析用户请求(2)
- 插入行(1,特指插入一个单位行)
- 插入索引(1,特指插入一个索引)
- 关闭(1)
因此,你可以采取以下方式来优化插入操作:
-
如果插入多行,那么使用
INSERT
语句一次性插入多行的功能,这样子速度会远高于单行插入,并且,调整bulk_insert_buffer_size
参数,也可以使得插入操作更快。 -
如果数据是来自于一个文本文件,那么使用
LOAD DATA
命令,该命令通常比INSERT
操作要快20倍。 -
尽量利用那些含有默认值的列,这样子可以减少Mysql的解析和插入开销。
-
See Section 8.5.5, “Bulk Data Loading for InnoDB Tables” for tips specific to
InnoDB
tables. -
See Section 8.6.2, “Bulk Data Loading for MyISAM Tables” for tips specific to
MyISAM
tables.
2 Optimizing UPDATE Statements
UPDATE
语句的优化类似于SELECT
,只是多了一个写入操作;对于写入操作,和INSERT
类似,一次性进行多行更新速度将比单行更新快很多。
3 Optimizing DELETE Statements
注:官方文档对于DELETE操作只涉及到了MyISAM表,对于InnoDB部分应该是通用的。
对于MyISAM
表,删除行操作的开销通常来讲主要由需要更改的索引数量来决定,为了加快删除速度,可以增大key_buffer_size
系统变量。
如果需要删除表中的所有行,那么使用TRUNCATE
来代替DELETE FROM
操作,TRUNCATE
不是事务安全的,如果碰到其他事务或者表锁,那么会跑出错误,所以速度会比DELETE FROM
快很多。