数据库优化方案

java大数据处理调优

一、当数据库单表数据量达到百万千万以上级别或者请求数据开始变得有所缓慢的时候,就需要开始考虑大数据的调优方案了。

这里说下我自己的理解:我认为系统性能调优是一个循序渐进的过程,需要衡量人力成本、时间成本、金钱成本的问题,如果项目在生产环境运行平稳大可不必做什么优化,如果需要的话当然一开始肯定是需要从成本最低的方式开始进行。


image.png

二、数据库优化步骤(不一定按照以下顺序)

1、分页思想。读取写入数据库或者EXCEL在数据量特别大的时候JAVA堆肯定是没办法容纳所有对象的,这时候就需要采用分页分批的形式来读取或者写入。

  • 页面的分页尽量采用服务端分页,即每页请求一次数据,没有必要一下子所有页的数据返回,这个看具体情况。
  • 限制客户端查询区间。假如一下需要查询导出几年区间内的几千万条数据,再好的服务器面对这种查询的时候,也没办法腾出时间去应付其他请求。很多的网站APP为了保障性能都做了类似限制,比如查询区间不能超过一个月,不能查询多早以前的历史数据等等。
  • 读取数据也是利用的分页思想,如果无法一次全部读取到内存,那只能分次分批查询或者增大JAVA堆内存。
  • 导出百万条以上EXCEL的时候使用POI的SXSSFWorkbook也是同样的道理,因为POI的Row、Cell对象占据了非常多的内存,SXSSFWorkbook可以限制在内存中的Row数量,其余的对象会先写入临时文件中,最后在进行汇总。
  • 存储数据的时候尽量做批量存储,存储完毕后及时清除缓存,对象如果可以重用的话就不要再去new太多新的对象。

2、尽量对每条SQL进行EXPLAIN分析(特别是慢查询),为表添加必要的索引。

这里强调的必要的索引,比如一些在where、join on、order by和group by常用的字段上建立索引。因为无用的索引会占用一定的磁盘空间,并且增删改数据的时候索引需要重新组织也会浪费一定的时间。

  • 尽量使优化后EXPLAIN的TYPE达到REF或者EQ_REF的级别。
  • 另外EXPLAIN中的EXTRA中如果是Using temporary或者Using filesort表明排序等操作效率较低,也需要进行优化。

3、最好一开始就设计好数据库存储结构,优化程序代码

  • 一般说来,数据库设计只需满足第三范式(3NF)就行了,可以适当添加一些冗余字段以减少表连接。
  • 程序中应该避免在for循环中调用DAO层循环查询数据库,比如1000个id,用for循环每次使用1个id作为参数去查询数据库,这是非常愚蠢的行为。减少数据访问是优化数据库最有效的手段,因为通常框架中每次的查询都是利用的线程池,借用线程、归还线程、磁盘IO都是耗时的操作。因此程序中如果有类似的操作一定要避免,可以通过一次查询将可能用到的数据一次取出,然后再到程序中做拼接,效果会比for循环查询数据库大大提升。


    数据库优化方案_第1张图片
    image.png

4、利用定时任务生成中间表数据

有些非常耗时的数据统计是没有办法进行优化的,SQL语句固定,索引也有用上但是速度还是不行的话就只能采用这种方式。比如一些日统计任务,都是需要全表扫描、多表连接的,这种对实时性要求不高的我们就利用定时任务在空闲时间去做,将统计结果保存到一个中间表内,客户端请求的时候就可以直接获取。

5、缓存常用数据

像最常见的后台管理系统的菜单就非常适合做缓存,变动少,请求量大。利用REDIS等缓存数据库。持久框架的二级缓存不好管理,基本上是关闭不用,一级缓存默认开启。

6、主从复制、集群

通常一个网站都是80%读与20%写,利用主从复制实现读写分离,利用集群实现高性能高可用。合理的将读写的压力分配到多台服务器。

7、分区分表分库

如果以上五步还是无法解决,那就要考虑分区分表分库了。因为实际生产环境MYSQL在千万条以下数据量的时候都还是没有问题的(服务器性能不错)。

  • 但是能不做分区分表分库的时候就一定不要做,因为后续会引发特别多的问题,比如表连接、分布式事务、程序中的读写路由等等,都是很难处理的问题。因为实际上做了以上几步的话性能还是不错的。
  • 分区是比较简单的,原理是将一张大表分成多个小文件存储,常用的分区类型有:RANGE、LIST、HASH,可以直接在NAVICAT配置,对程序透明,无需改代码。
  • 分表分库自己实现可能比较麻烦,有中间件MYCAT。

8、考虑使用ORACLE数据,升级硬件

成本高

三、其他方面优化

1、应用服务器负载均衡

CDN、软件负载均衡、硬件负载均衡

2、图片服务器分离

3、前端优化

4、Java设计优化

设计模式、缓存、缓冲、多线程、连接池、分布式缓存

5、JVM、TOMCAT调优

见TOMCAT章节

6、调整需求

7、性能调优工具

JMETER、JCONSOLE、JVISUALVM

你可能感兴趣的:(数据库优化方案)