解决数据库高并发的常见方案:
1) 缓存式的 Web 应用程序架构:html
在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减小数据库读取负担,提升数 据读取速度。cache 存取的媒介是内存,能够考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增长了灵活性。数据库
2) 增长 Redis 缓存数据库:缓存
把常常访问到的数据并且不须要常常变化的数据放在缓存中。服务器
主要针对于数据与用户无直接关联,写少读多的数据,使用缓存来减小数据库的压力。架构
第一获取数据从数据库中提取,而后保存在缓存中,之后就能够直接从缓存中加载数据,须要有机制维持缓存和数据库的一致性。并发
3) 增长数据库索引:负载均衡
索引能够看做是特殊的缓存,尽可能使用索引就要求where字句中精确的给出索引列的值。异步
4) 页面静态化:分布式
效率最高、消耗最小的就是纯静态化的 html 页面,因此咱们尽量使咱们的网站上的页面采 用静态页面来实现,这个最简单的方法其实也是最有效的方法。用户能够直接获取页面,不用像 MVC 结构走那么多流程,比较适用于页面信息大量被前台程序调用,可是更新频率很小的状况。高并发
5) 使用存储过程:
处理一次请求须要屡次访问数据库的操做,能够把操做整合到储存过程,这样只要一次数据库访问就能够了。
6) MySQL 主从读写分离:
当数据库的写压力增长,cache 层(如 Memcached)只能缓解数据库的读取压力。读写集 中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave 模式)来达到读写分离,以 提升读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是 让主数据库处理事务性查询,而从数据库处理 select 查询,数据库复制被用于把事务性查询(增删改) 致使的改变动新同步到集群中的从数据库。
MySQL 读写分离提高系统性能:
一、主从只负责各自的读和写,极大程度缓解 X 锁和 S 锁争用。
二、slave 能够配置 MyISAM 引擎,提高查询性能以及节约系统开销。
三、master 直接写是并发的,slave 经过主库发送来的 binlog 恢复数据是异步的。
四、slave 能够单独设置一些参数来提高其读的性能。
五、增长冗余,提升可用性。
实现主从分离可使用 MySQL 中间件如:Atlas
7) 分表分库:
在 cache 层的高速缓存,MySQL 的主从复制,读写分离的基础上,这时 MySQL 主库的写 压力开始出现瓶颈,而数据量的持续猛增,因为 MyISAM 使用表锁,在高并发下会出现严重的锁问 题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎代替 MyISAM。采用 Master-Slave 复制模式 的 MySQL 架构,只能对数据库的读进行扩展,而对数据的写操做仍是集中在 Master 上。这时须要 对数据库的吞吐能力进一步地扩展,以知足高并发访问与海量数据存储的需求。
对于访问极为频繁且数据量巨大的单表来讲,首先要作的是减小单表的记录条数,以便减小 数据查询所需的时间,提升数据库的吞吐,这就是所谓的分表【水平拆分】。在分表以前,首先须要 选择适当的分表策略(尽可能避免分出来的多表关联查询),使得数据可以较为均衡地分布到多张表中, 而且不影响正常的查询。
分表可以解决单表数据量过大带来的查询效率降低的问题,可是却没法给数据库的并发处理 能力带来质的提高。面对高并发的读写访问,当数据库 master 服务器没法承载写操做压力时,无论 如何扩展 Slave 服务器都是没有意义的,对数据库进行拆分,从而提升数据库写入能力,即分库【垂直拆分】。
8) 负载均衡集群:
将大量的并发请求分担到多个处理节点。因为单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。