Mycat个人心得笔记(一)
目录
四.最终结论:早期使用的单机设计模式;解决利用查询时间效率换区空间资源的节省;
一.简介
上几篇博客介绍了,Nginx 前端请求并发 Redis集群 缓存处理,数据库方面的技术没有介绍,下面简单介绍下关于数据库集群方面的技术
- 一个彻底开源的,面向企业应用开发的“大数据库集群”
- 支持事务、ACID、可以替代Mysql的加强版数据库
- 一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
MyCat的目标是:
低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。
二.数据库策略(单击策略,集群策略)
一.单机
早期硬件极其昂贵,系统的并发能力要求不高;如现在的常用的Mysql
二.策略:三范式原则(可以去看看相关技术博客)
◆ 第一范式(1NF):
强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。
◆ 第二范式(2NF):
首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。
◆ 第三范式(3NF):
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
参考文献 https://blog.csdn.net/QingKing520/article/details/52937728
三.范式总结:
- 数据库字段数据不可拆分(关系型数据库自动满足这个要求)
- 在满足第一范式的基础上,所有的非主键字段必须完全依赖主键字段;
- 第二范式的一种特殊情况,不是复合主键,非主键字段必须依赖主键字段不能依赖其他非主键字段
只要不满足三范式设计的表格都要进行拆分处理,造成数据库表格结构极其精简,但是表非常多,使用数据是需要关联查询,满足三范式就不能做冗余字段;
早起,硬盘存储过小,牺牲查询时间效率,换取空间资源的节省
四.最终结论:早期使用的单机设计模式;解决利用查询时间效率换区空间资源的节省;
- 用户的要求越来越高;
- 单机设计策略不能在使用三范式;
- 找到一种设计模式,利用空间资源换区查询时间效率--违反三范式就能做到--反范式
五.企业中主流设计原则:反三范式
- 物理内存、硬盘空间极其昂贵。在设计中节省空间首要指标。
- 现今设计的节省时间,提高效率,提高用户的使用满意度。查询速度快,页面展现快。
- 缺点:信息在数据库中不唯一,需要对多处维护。
- 反三范式:目的,利用空间换时间。
六.索引
定义:按照一定规则(排序)的组成数据结构.实现存储在磁盘,利用索引快速定位目的数据的一批文件
磁盘最小数据存储为512B 存储都是512的倍数
- mysql数据库每生成一条或一批数据存储在磁盘上,
- 都会对应在索引的数据内添加数据的索引信息,
- 从而可以利用索引数据快速定义磁盘目的起始地址;
- 可以帮助查询数据的起始位置,从而让磁头进行更少磁盘io操作
mysql中的所用数据结构 B+TREE (硬盘中数据的结构)
三阶的b+tree最多帮助查找27条数据,随着数据越来越多,数据库会把b+tree变得越来越高,越来越宽
阶数+1次io 能使用id做索引,能不是使用string类型的user_id,user_name做索引 保证排序
单机数据库无论从设计,从索引的优化,都会最终瓶颈卡在硬件读写速度上现代磁盘150M/S;
单机无法解决海量高并发的数据,最快固态硬盘在传输速度3500M/s左右
三.数据库集群
一.数据库的集群结构:
数据库的主从复制技术是高可用分布式集群的基础
二.mysql数据库的主从复制
mysql数据支持一主多从,多级主从;搭建主从结构之前了解主从复制原理
三.mysql的主从复制原理
一主一从为结构,了解复制的原理
搭建主从mysql结构时
- 主节点:开启一个二进制日志文件(mysql默认不开二进制)
- 从节点:开启io线程,读取主节点二进制文件
- 开启中继日志,保存io读取的数据
- 开启sql线程,跟新本地数据