Java学习之Mysql结构优化
背景:业务发展初期为了便于快速迭代,很多应用都采用集中式的架构,随着业务规模的扩展,系统变得越来越复杂,访问量越来越大,不得不进一步扩展系统的吞吐能力。
优化1、主从集群:通过数据库的复制策略,可以将一台mysql数据库服务器中的数据复制到其他的mysql数据库服务器之上,当各台数据库服务器上都包含相同数据的时候,前端应用通过访问mysql集群中任意一台服务器,都能够读取到相同的数据,这样,每台mysql服务器所需要承担的负载就会大大降低,从而提高整个系统的承载能力,达到系统扩展的目的。
要实现数据库的复制,需要开启master服务器端的binary log,数据复制的过程实际上就是slave从master获取binary log,然后再在本地镜像的执行日志中所记录的操作,由于复制过程是异步的,因此,master和slave之间的数据有可能存在延迟的现象,此时只能够保证数据最终的一致性。
优化2、读写分离:前端服务器通过master来执行数据写入的操作,数据的更新通过binary log同步到slave集群,而对于数据读取的请求,则交由slave来处理,这样,slave集群可以分担数据库读的压力,并且,读写分离还保障了数据能够达到最终一致性。一般而言,大多数站点的读数据库操作要比写数据库操作更为密集,如果读的压力较大,还可以通过新增slave来进行系统的扩展,因此,master-slave的架构能够显著的减轻前面所提到的单库读的压力,毕竟在大多数应用当中,读的压力要比写的压力大的多。
master-slaves复制架构存在一个问题,即所谓的单点故障,当master宕机,系统将无法写入,而在某些特定的场景下,可能需要master停机,以便进行系统维护、优化或者升级,同样的道理,master停机将导致整个系统都无法写入,直到master恢复,大部分情况下这显然是难以接受的。为了尽可能的降低系统停止写入的时间,最佳的方式就是采用dual master架构,即master-master架构。
优化3、分表:对于访问极为频繁且数据量巨大的单表来说,我们首先要做的,就是减少单表的记录条数,以便减少数据查询所需要的时间,提高数据库的吞吐,这就是所谓的 分表。在分表之前,首先需要选择适当的分表策略,使得数据能够较为均衡的分布到多张表中,并且,不影响正常的查询。对于互联网企业来说,大部分数据都是与用户进行关联的,因此,用户id是最常用的分表字段,因为大部分查询都需要带上用户id,这样既不影响查询,又能够使数据较为均衡的分布到各个表中。
优化4、分库:分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升,面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的 分库。举例来说,假设某门户网站,它包含了新闻、用户、帖子、评论等等几大块内容,对于数据库来说,它可能包含这样几张表,news、users、post、comment,随着数据量的增加,可以根据业务逻辑进行拆分,分成多个库,以提高系统吞吐能力。
有的时候,数据库可能即面临着高并发访问的压力,又需要面对海量数据的存储问题,这时候,需要对数据库即采用分库策略,又采用分表策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能,这就是所谓的 分库分表。
假设将原来的单库单表order拆分成256个库,每个库包含1024个表,那么,按照前面所提到的路由策略,对于userid=262145的访问,路由的计算过程如下:
中间变量=262145%(256*1024)=1
库=取整(1/1024)=0
表=1%1024=1
这意味着,对于userid=262145的订单记录的查询和修改,将被路由到第0个库的第1个表中执行。
缺陷:
1.条件查询、分页查询受到限制,查询必须带上分库分表所带上的id
2.事务可能跨多个库,数据一致性无法通过本地事务实现,无法使用外键
3.分库分表规则确定以后,扩展变更规则需要迁移数据
Java学习之Mysql结构优化的更多相关文章
- mysql学习(2)-MySQL服务器优化
调优思路: 1.数据库设计与规划--以后再修该很麻烦,估计数据量,使用什么存储引擎 2.数据的应用--怎样取数据,sql语句的优化 3.mysql服务优化--内存的使用,磁盘的使用 4.操作系统的优化 ...
- Java学习笔记——MySQL创建表结构
一.创建/删除数据库. create database t14; drop database t14; use t14; 二.创建若干表用于测试 这里预留了几个坑,下面要填坑的.. /*创建学生表*/ ...
- java学习之语句结构
在java语言当中存在4中语句结构,分别是: 1.顺序结构 2.判断结构 3.选择结构 4.循环结构 一.顺序结构: 所谓的顺序结构,也就是当不指定其他三种语句结构的情况下,语句是从上往下依次执行的, ...
- Java学习笔记——MySQL的安装使用以及SQL语法简介
在 Java 的开发中,数据库的应用是非常必要的,下面,我们为Java对于数据库的应用做一些必要的准备工作.. Java 对数据库的应用统称为 JDBC. JDBC(Java Data Base Co ...
- MySQL学习笔记-MySQL数据库优化实践[转]
最近一段时间,我们整理了一些关于Percona,Linux,Flashcache,硬件设备的优化经验,分享给大家: 硬件 1.开启BBWC RAID卡都有写cache(Battery Backed W ...
- Java学习笔记——MySQL开放3306接口与设置用户权限
系统Ubuntu16.04 LTS 1.开放3306端口查看端口状态:netstat -an|grep 3306tcp 0 0 127.0.0.1:3306 ...
- Django学习之项目结构优化
其实就是采用包结构,比如: 目录models,包含__init__.py,a.py,b.py 然后将model class写在a和b中,但是这样的话,导入时就要改变了! from models imp ...
- Java学习之分支结构---判断语句:if语句和switch语句
一个if语句包含一个布尔表达式和一条或多条语句,if 语句的用语法如下:if 语句 if(布尔表达式) { //如果布尔表达式为true将执行的语句 },如果布尔表达式的值为 true,则执行 if ...
- java学习:循环结构的使用规则和注意事项
循环结构的基本组成部分,一般可分为四部分: 初始化语句:在循环开始最初执行,而且只做唯一一次 条件判断:如果成立,则循环继续:如果不成立,则循环退出. 循环体:重复要做的事情内容,若干行语句. 进步语 ...
随机推荐
- 20165332实验一 Java开发环境的熟悉
实验一 Java开发环境的熟悉 一.Java开发环境的熟悉-1 1.实验要求: 0 参考实验要求: 1 建立"自己学号exp1"的目录 : 2 在"自己学号exp1&qu ...
- H5手机端按钮点击一次却触发了多次点击事件
方案:在点击事件方法中加入以下语句 event.stopPropagation();
- IOS-KVO、KVC
√ 概述 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving 非正式协议的形式被定义为 ...
- 31-THREE.JS 正方体
<!DOCTYPE html> <html> <head> <title>Example 05.04 - Basic 2D geometries - C ...
- docker建立和共享文件(服务器和docker之间的共享)
建立序列号:sudo docker run -it domimiek/deep-base /bin/bash 回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...
- 使用display:inline-block产生间隙
使用display:inline-block产生间隙 一.产生的原因:当初设立标准的不是亚洲而是欧洲,inline元素为了正确显示英文字母如y j g等带有尾巴的,就在底下留空.二.解决办法: 四个d ...
- MVC 框架中的缓存
在程序中加入缓存的目的很多是为了提高程序的性能,提高数据的查找效率,在MVC框架中也引入了非常多的缓存,比如Controller的匹配查找,Controller,ControllerDescripto ...
- 伪变量foo foober是什么意思
原文: The terms foobar, foo, bar, baz and qux are sometimes used as placeholder names (also referred t ...
- 在Windows下为PHP5.6安装redis扩展
Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...
- [JS学习笔记]Event对象
写在前面 学习和总结JS时会伴随性的生成一些dome,其中包含一些动态输出的结果和标注. 之前通过鸡贼的办法实现了在博客中执行JS,但很多时候需要一张干净的页面编写dome,所以尝试通过一些在线的JS ...