一、 减少数据访问
- 创建并使用正确的索引
- 只通过索引访问数据
- 优化SQL执行计划
二、返回更少的数据
- 数据分页处理
(1)客户端(应用程序或浏览器)分页
(2) 应用服务器分页
(3) 数据库SQL分页:rowid比rownum需要的IO少 - 只返回需要的字段
三、减少交互次数
-
batch DML
采用batch操作一般不会减少很多数据库服务器的物理IO,但是会大大减少客户端与服务端的交互次数,从而减少了多次发起的网络延迟开销,同时也会降低数据库的CPU开销。 -
IN List
例:用ID IN LIST:
select * from mytable where id in(:id1,id2…idn);
通过这样处理可以大大减少SQL请求的数据,从而提高性能。 -
设置Fetch Size
如果我们要从服务端一次取大量数据时,可以加大fetch_size,这样可以减少结果传输的交互次数及服务器数据准备时间,提高性能。 -
使用存储过程
-
优化业务逻辑
-
使用Resultset游标处理记录
采用resultset游标处理记录时,应该将游标的打开方式设置为FORWARD_READONLY模式,否则会把结果缓存在JVM里,造成JVM Out of Memory问题。
四、减少数据库服务器CPU运算
- 使用绑定变量
绑定变量优点: ①防止sql注入 ②提高SQL可读性 ③提高SQL解析性能
不使用绑定变量一般称为硬解析,使用绑定变量我们称为软解析。
绑定变量是指sql中对变化的值采用变量参数的形式提交,而不是在sql中直接拼写对应的值。
非绑定变量写法:select * from employee where id = 123;
绑定变量写法:select * from employee where id = ? Prepare statement.set Int(1,123) - 合理使用排序
- 减少比较操作
- 大量复杂运算在客户端处理
五、利用更多的资源
- 客户端多进程并行访问,前提是数据库主机资源有空间
- 数据库并行处理
六、主体思想保证服务器到不了并发瓶颈,在这个前提下,尝试优化
七、常用的优化策略首选索引,其次是交互次数和分页技术的使用
八、在数据量极其庞大的前提下,首选分布式处理方式
设置并行数的建议:
- 如果瓶颈在服务器主机,但是主机还有空闲资源,那么最大并行数取主机cpu核数和主机提供数据服务的磁盘数两个参数中的最小值,同时要保证主机有资源做其它任务。
- 如果瓶颈在客户端处理,但是客户端还有空闲资源,那建议不要增加sql的并行,而是用一个进程取回数据后在客户端起多个进程处理即可,进程数根据客户端cpu核数计算。
- 如果瓶颈在客户端网络,那建议做数据压缩或者增加多个客户端,采用map reduce的架构处理。
- 如果瓶颈在服务器网络,那需要增加服务器的网络带宽或者在服务端将数据压缩后再处理了。