Chinaunix首页 | 论坛 | 博客
  • 博客访问: 378217
  • 博文数量: 75
  • 博客积分: 1732
  • 博客等级: 上尉
  • 技术积分: 812
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-11 16:02
个人简介

博客很久没有更新了,原因是大多数时间都忙在研究技术上,却懒得腾时间出来把技术分享,最近在开源力量上开课《Mongodb管理与维护》,让屌丝们从0到精通,敬请关注。本博客技术原创更新滞后一些,找时间更新有关mysql,mongodb等内容,谢谢大家关注。

文章分类

全部博文(75)

文章存档

2021年(1)

2011年(20)

2010年(40)

2009年(7)

2008年(7)

分类: Mysql/postgreSQL

2010-07-06 11:44:47


三种dml操作优化


 

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