Update语句优化方法:
Update的速度依赖三个因素,
(1)找到要更新行的时间,(2)更新操作涉及的行数. (3)更
新的列含有index数量.
1.找到需要update的行数花的时间,
这个是对于update有where条件时,update要先使用
select…where找到
要更新的行,如果要它执行的快,就需要考
虑index使用问题.
例如:
update `relation` set status='2' where `group`=0
and owneruid =1276383021 and type=2 and status=1
要考虑:
select
* from `relation` where `group`=0 and owneruid =1276383021 and
type=2
and status=1这样语句的速度.
2.update涉及的行数,即要update多少行,更新的行数越少,速度当然越快.
3.Update
的字段中含有索引数,即update的列中有几个是有index的. 更新的column涉及
的index越少,更新的速度越快.
4.另
一个提高更新速度的方法是,把同种更新放到一起,例如有5个更新操作,这样可以修
改了index buffer之后做一些flush to
di操作,而且可以减少 overhead for lock
table,因为lock table的操作很消耗时间.如果有5更新可以这样做:
Lock
table
5个Update操作.
Unlock table
5.对于myisam 引擎的表,
表类型为dynamic(既字段的类型含有varchar类型.), 如果每
一行包含的数据长度比较大,
做更新操作容易导致行数据库物理
存储分开, 偶尔做一些optimize table 对性能有比
较好的效果.
6.对于update列涉及比较多的index,增大
key_buffer_size,能提高更新速度
Insert语句优化方法:
1.对于同一个表来说,insert一行,
再insert一行,没有insert 后面跟两个value快,例
如:
insert into a values(1,23);
Insert
into a values(2,34);
Insert into a values(4,33);
没有这样下面的语句快.
INSERT
INTO a VALUES (1,23),(2,34),(4,33);
2.提高bulk_insert_buffer_size对于
insert操作有一定的性能提升,这个值默认是8M.
提高这个值
对于这样的语句: INSERT ... SELECT,
INSERT ... VALUES (...), (...), ..., LOAD DATA INFILE都很有效果.
3.对于一个
client要做很多insert操作,建议使用insert deplayed…语句,这样做会是
client不用等待
一个
insert操作完再进行另一个insert操作,而是直接返回一个插入完成,真正的insert
操作会进入队列
结合在一起进行.这样速
度比较快,也避免client等待时间,同时也会是前面说到的,把对
同一张表的语句放在一起操作.效率比较高.
4.对于myisam表来
说, 在mysql5.0以后,修改concurrent_insert变量为2会对insert性
能有一定的提高.
但会带来空间的浪
费,具体为什么,可以看这个参数的详细说明.
5.能使用load data infile
尽量使用这个命令,比直接insert速度快很多倍,有些情况
下能达到20倍左右.特别是对于myisam表来说,
先不建index,然
后执行load data infile 然后建index,能避免数据量巨大的表,在导入
过程中出错的问题(现在很多巨大的myisam表在做
字符集转化或迁移时都会遇到的这样
的问题).
6.增大key_buffer_size对于insert也有很大的提高。
7.考虑
一种情况, 如果同时有5个连接进行insert操作,第一个连接insert 记录100条,
第二个连接插入一条,
第三个连接插入1000条,如果一句一句的执行,那么第二条可能比
其他两条先返回插入结果.但三条都完成的总时间,没有使用lock
table; 第一条,第二
条,第三条语句快.但单条语句的执行比较长,这样的特例在有些情况下有用.
Delete语句
优化方法:
1.Delete操作的速度是index数量成正比, 表中index数量越多,更新操作越慢.
2.如果delete带
where条件, where能否用到index比较找到需要delete的行时间,也是
delete比较慢的一个因素,所以要提高delete
带Where操作时,要提高查到delete行的操
作时间.
3.增加key_buffer_size能提高delete的速度.
原因是更新操作可以先在memory进行,然
后再更新到数据文件.这样操作比直接
更新数据文件,对disk操作速度快很多.
4.
不带where条件的delete操作, 使用truncate table比delete from table快很多
(truncate
不记录log而且会是自增字段reset).
例如要删除一个数据量很大的表,可以这样操作:
truncate table tb;
drop table tb;很快就可以清掉一个数据量很大的表.