MySQL的约束:
非空约束 (NOT NULL):
确保列中的值不能为空。例如: name VARCHAR(100) NOT NULL 表示 name 列不能存储空值。
默认值约束 (DEFAULT):
指定列的默认值,当插入新行时,如果未指定该列的值,则会自动使用默认值。例如, age TINYINT(4) DEFAULT O 表示如果未指定 age 的值, 则默认为 0。
主键约束 (FRIMARY KEY):
唯一标识表中每行记录的列或列组合。主键必须唯一且非空。通常用于确保表中每行的唯一性。例如, id INT(11) PRIMARY KEY表示 id 列是主键。
唯一约束(UNIQUE):
确保列中的所有值是唯一的,但允许空值(不同于主键约束, 主键不允许空值)。例如, email VARCHAR(100) UNIQUE 表示 email 列中的值必须唯一。
检查约束 (CHECK):
在插入或更新操作时,对列中的值进行条件检查。MySQL不直接支持 CHECK 约束, 但可以通过触发器来实现类似的功能。
外键约束(FOREIGN KEY):
用于建立两个表之间的关系,确保一个表中的数据引用另一个表中存在的数据。例如, FOREIGN KEY( student _ id) REFERENCES students( id) 表示 student _ id 列是一个外键, 参考 students 表中的 id 列。
MySQL的读写分离(Mycat)
读写分离
读写分离基于主从复制实现
主服务器实现写
从服务器实现读
提升数据库的并发负载能力
什么是读写分离?
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。
数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
为什么要读写分离呢?
因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
但是数据库的“读”(读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
什么时候要读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。
利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
MySQL 读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读。
主数据库(Master)负责处理所有的写操作,它维护着完整的数据集。
而从数据库(Slave)通过复制主数据库的数据,提供只读的服务。
基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。
常见的实现方式
基于程序代码内部实现。
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;
缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
基于中间代理层实现。
代表性程序
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
1)MySQL-Proxy
MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
2)Atlas
是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
支持事物以及存储过程。
3)Amoeba
由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
4)Mycat
是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。
由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。
Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。