Mysql优化(出自官方文档) - 第七篇
[TOC]
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
快很多。