1:缓存和页面静态化
数据量大这个问题最直接的解决方式就是使用缓存,缓存就是将从数据库中获取的结果临时保存起来。在下次使用的时候无需又一次到数据库中获取,这样能够大大减少数据库的压力。
缓存的使用方式能够分为通过程序直接保存到内存中和使用缓存框架两种方式。程序直接操作主要是使用Map,尤其是ConcurrentHashMap,而经常使用的缓存框架有Ehcache、Memcache和Redis等。
缓存使用过程中最重要问题是什么时候创建缓存和缓存的失效机制。
缓存的失效能够定期失效,也能够在数据发生变化的时候失效,假设按数据发生变化让缓存失效。还能够分粗粒度失效和细粒度失效。
只是缓存也不是什么情况都适用,它主要用于数据变化不是很频繁的情况。
跟缓存类似的第二种技术叫页面静态化。它在原理上跟缓存很类似,缓存是将从数据库中获取到的数据(当然也能够是别的不论什么能够序列化的东西)保存起来,而页面静态化是将程序最后生成的页面保存起来。使用页面静态化后就不须要每次调用都又一次生成页面了,这样不但不须要查询数据库,并且连应用程序处理都省了,所以页面静态化同一时候对数据量大和并发量高两大问题都有优点。
页面静态化能够在程序中使用模板技术生成,如经常使用的Freemarker和Velocity都能够依据模板生成静态页面。另外也能够使用缓存server在应用server的上一层缓存生成的页面,如能够使用Squid,另外Nginx也提供了对应的功能。
2:数据库优化
数据库优化的方法许多。经常使用的有表结构优化、SQL语句优化、分区和分表、索引优化、使用存储过程取代直接操作等。另外有时候合理使用冗余也能获得很好的效果。
(1)SQL优化
SQL优化有一个通用的做法就是。首先要将涉及大数据的业务的SQL语句运行时间具体记录下来。其次通过细致分析日志(同一条语句对不同条件的运行时间也可能不同,这点也须要细致分析)找出须要优化的语句和当中的问题。然后再有的放矢地优化。
(2)分区和分表
当数据量变多的时候,假设能够分区或者分表,那将起到很好的效果。当一张表中的数据量变多的时候操作速度就慢了,所以很easy想到的就是将数据分到多个表中保存。可是这么做之后操作起来比較麻烦,想操作(增删改查)一个数据还须要先找到对应的表,假设涉及多个表还得跨表操作。
事实上在经常使用的数据库中能够不分表而达到跟分表类似的效果,那就是分区。分区就是将一张表中的数据依照一定的规则分到不同的区来保存,
这样在查询数据时假设数据的范围在同一个区内那么能够仅仅对一个区的数据进行操作。这样操作的数据量更少,速度更快,并且这样的方法对程序是透明的,程序不须要做不论什么改动。
(3)索引优化
索引的大致原理是在数据发生变化(增删改)的时候就预先按指定字段的顺序排列后保存到一个类似表的结构中。这样在查找索引字段为条件的记录时就能够很快地从索引中找到对应记录的指针并从表中获取到记录,这样速度就快多了。只是索引也是一把双刃剑。它在提高查询速度的同一时候也减少了增删改的速度。由于每次数据的变化都须要更新对应的索引。
只是合理使用索引对提升查询速度的效果很明显,所以哪些字段使用索引、使用什么类型的索引都须要细致琢磨,并且最好再做一些測试。
(4)存储过程
在操作过程复杂并且调用频率高的业务中,能够通过使用存储过程取代直接操作来提高效率。由于存储过程仅仅须要编译一次。并且能够在一个存储过程里面做一些复杂的操作。
3:分离活跃数据
通过一个定期处理的任务将不活跃的用户转移到别的数据表中,在主要操作的数据表中仅仅保存活跃用户,查询时先从默认表中查找。假设找不到再从不活跃用户表中查找。这样就能够提高查询的效率
4:批量读取和延迟改动
批量读取和延迟改动的原理是通过减少操作的次数来提高效率。假设使用得恰当。效率将会呈数量级提升。
假设每保存一条记录都查询一次数据库,那么对每一个须要检查的字段,都须要查询与要保存的记录条数同样次数的数据库。这时能够先将全部要保存的数据的对应字段读取到一个变量中,然后使用in语句统一查询一次数据库,这样就能够将n(要保存记录的条数)次查询变为一次查询了。除了这样的对同一个请求中的数据批量读取。在高并发的情况下还能够将多个请求的查询合并到一次进行。
延迟改动主要针对高并发并且频繁改动(包含新增)的数据。如一些统计数据。这样的情况能够先将须要改动的数据临时保存到缓存中,然后定时将缓存中的数据保存到数据库中,程序在读取数据时能够同一时候读取数据库中和缓存中的数据。
这样的方式下假设保存缓存的机器出现了问题将可能会丢失数据,所以假设是重要的数据就须要做一些特殊处理。
5:读写分离
读写分离的本质是对数据库进行集群,这样就能够在高并发的情况下将数据库的操作分配到多个数据库server去处理从而减少单台server的压力普通情况下是将写操作交给专门的一台server处理,这台专门负责写的server叫做主server。
当主server写入(增删改)数据后从底层同步到别的server(从server),读数据的时候到从server读取,从server能够有多台,这样就能够实现读写分离.
6:分布式数据库
分布式数据库是将不同的表存放到不同的数据库中然后再放到不同的server。这样在处理请求时。假设须要调用多个表,则能够让多台server同一时候处理,从而提高处理速度。
数据库集群(读写分离)的作用是将多个请求分配到不同的server处理,从而减轻单台server的压力。而分布式数据库是解决单个请求本身就很复杂的问题,它能够将单个请求分配到多个server处理,使用分布式后的每一个节点还能够同一时候使用读写分离。从而组成多个节点群。
7:NOSQL和Hadoop
NoSQL是近年来发展很迅速的一项技术,它的核心就是非结构化。我们一般使用的数据库(SQL数据库)都是须要先将表的结构定义出来。
NoSQL就是突破了这些条条框框,能够很灵活地进行操作,另外由于NoSQL通过多个块存储数据的特点。其操作大数据的速度也很快。
Hadoop是专门针对大数据处理的一套框架,随着近年来大数据的流行Hadoop也水涨船高,出世不久就红得发紫。
Hadoop对数据的处理是先对每一块的数据找到对应的节点并进行处理。然后再对每一个处理的结果进行处理,最后生成终于的结果。比方,要查找符合条件的记录。Hadoop的处理方式是先找到每一块中符合条件的记录。然后再将全部获取到的结果合并到一起,这样就能够将同一个查询分到多个server处理。处理的速度也就快了,这一点传统的数据库是做不到的。