星期五, 七月 06, 2007

MySQL数据库插入性能的改进

最近,重新开始了对3年前一个项目的改进,该项目采用JDBC+MySQL的方式完成一些数据库操作,记得当时是每秒中可以插入70条左右的数据,由于可以满足当时的需要就没有太在意!

抱着软件质量就是持续不断的改进的态度,想把当初的JDBC+MySQL改为C API实现的方式,所以今天写了一个C程序客户端,测试中发现美妙中可以插入50条记录,感到可能时在什么地方用错了,到Google一些资料后,基本可以判断是采用了AOTOCOMMIT一引起的问题,所以对操作方式做了一些修改
SET AOTOCOMMIT=0
然后每插入1000条,就COMMIT一次,发现这个时候每秒可以插入2000条数据,比较满足。

可以看出,COMMIT是一个比较费时的过程
50*(COMMIT_COST + INSERT_COST) 基本等于 2000*INSERT_COST + 2*COMMIT_COST,此时客户端花的CPU比服务器要多。

继续改进,采用Prepare Statemode来降低INSERT语句的分析花费,每秒可以插入5000条
2000*INSERT_COST(SQL_PARSE+REAL_INSERT) + 2*COMMIT_COST基本等于5000*REAL_INSER + 5*COMMIT_COST
这个时候,客户端已经比服务器端花的时间少了,且服务器端出现了花费了更多的系统CPU,应该时磁盘IO操做便多的缘故!

没有评论: