黑马程序员技术交流社区

标题: 【广州python】MYSQL数据库访问性能优化之减少交互次数 [打印本页]

作者: dingliu    时间: 2018-8-30 17:07
标题: 【广州python】MYSQL数据库访问性能优化之减少交互次数
本帖最后由 dingliu 于 2018-10-23 11:34 编辑

一、批量提交

jdbc支持batch的提交处理方法,当一次性要往表中插入1000万条数据时,如果采用普通处理,交互次数为1000万次,按每秒钟可以向数据库服务器提交10000次估算,要完成所有工作需要1000秒。如果采用批量提交模式,1000条提交一次,那么和服务器交互次数为1万次,交互次数大大减少。采用batch操作一般不会减少很多数据库服务器的物理IO,但是会大大减少客户端与服务端的交互次数,从而减少了多次发起的网络延时开销,同时也会降低数据库的CPU开销。


二、使用In

按一些ID查询数据库记录,我们可以采用一个ID一个请求发给数据库,如下所示:

  select * from mytable where id=var;

使用in的方式

select * from mytable where id in(:id1,id2,...,idn);


通过这样处理可以大大减少SQL请求的数量,从而提高性能。那如果有10000个ID,肯定不能使用in操作。IN里个数的限制,当IN数量达到一定值时有可能改变SQL执行计划,从索引访问变成全表访问,这将使性能急剧变化。in中个数越多SQL的执行计划会更复杂,占用的内存将会变大。


三、设置Fetch Size

采用select从数据库查询数据时,数据并不是一条一条返回给客户端的,也不是一次全部返回客户端的,而是根据客户端fetch_size参数处理,每次只返回fetch_size条记录,当客户端游标遍历到尾部时再从服务端取数据,直到最后全部传送完成。所以如果我们要从服务端一次取大量数据时,可以加大fetch_size,这样可以减少结果数据传输的交互次数及服务器数据准备时间,提高性能。


四、使用存储过程

大型数据库一般都支持存储过程,合理的利用存储过程也可以提高系统性能。如果采用存储过程你可以将整个业务逻辑封装在存储过程里,然后在客户端直接调用存储过程处理,这样可以减少网络交互的成本。


扫码关注黑马视频库公众号,免费获取黑马全学科视频教程





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2