Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426601
  • 博文数量: 137
  • 博客积分: 5190
  • 博客等级: 大校
  • 技术积分: 997
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 16:19
文章存档

2011年(17)

2010年(120)

我的朋友

分类: Mysql/postgreSQL

2010-02-26 23:37:55

 

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;很快就可以清掉一个数据量很大的表.
阅读(1691) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~