关系型数据库(二维表)
管理数据库使用SQL(结构化查询语言)
DDL 数据定义语言 如:CREATE、ALTER、DROP
DML 数据操作语言 如:INSERT、UPDATE、DELETE
DCL 数据控制语言 如:GRANT、REVOKE
DTL 数据事务语言 如:COMMIT、ROLLBACK、SAVEPOINT
SQL命令不区分字母大小写(密码、变量值除外)
每条SQL命令以;结束
默认命令不支持Tab键自动补齐
\c 终止sql命令
可以创建多个库,通过库名区分
SHOW DATABASES; #显示已有的库
SELECT USER( ); #显示连接用户
USE 库名; #切换库
SELECT DATABASE( ); #显示当前所在的库
CREATE DATABASE 库名; #创建新库
SHOW TABLES; #显示已有的表
DROP DATABASE 库名; #删除库
mysql> CREATE DATABASE DB1;
mysql> CREATE TABLE 库名.表名( 字段名1 类型(宽度), 字段名2 类型(宽度), …… )DEFAULT CHARSET=utf8;
mysql> DESC db1.stuinfo;
按数据实际大小分配存储空间(0-65535)
字符个数超出时,无法写入数据。
大文本类型:text/blob
字符数大于65535存储时使用
类 型 | 用 途 |
---|---|
CURTIME( ) | 获取当前的系统时间"时:分:秒"部分 |
CURDATE( ) | 获取当前的系统时间"年-月-日"部分 |
NOW( ) | 获取当前系统时间"年-月-日 时:分:秒" |
YEAR(NOW()) | 获取年 |
MONTH(NOW( )) | 获取月 |
DAY(NOW()) | 获取日 |
DATE(NOW()) | 获取日期"年-月-日" |
TIME(NOW()) | 获取时间"时:分:秒" |
创建db1.t5表,包含name字段 CHAR类型15个宽度,sex字段单选枚举类型("boy","girl","other")
mysql> CREATE TABLE db1.t5( -> name CHAR(15), -> sex ENUM("boy","girl","other") -> );
单列主键
复合主键
自增长
#包括+、-、*、/、%操作 #SELECT可以直接运行计算表达式 #也可以对表内已有的数据进行运算
#语法: IF(表达式,值1,值2) 如果表达式为真,则返回值1,如果表达式为假,则返回值2
IFNULL函数
#语法: IFNULL(值1,值2) 如果值1不为NULL(空)则返回值1,为NULL(空)则返回值2
CASE语句
#语法: 用于多分支判断 如果字段名等于某个值,则返回对应位置then后面的值并结束判断 如果与所有值都不相等,则返回else后面的结果并结束判断
SELECT 查询字段列表
FROM 库名.表名
WHERE 筛选条件
GROUP BY 分组字段
HAVING 过滤字段
ORDER BY 排序字段
LIMIT 行数
SELECT 字段列表 FROM 表1 AS 别名1 连接类型 JOIN 表2 AS 别名2 ON 连接条件 连接类型 JOIN ... 表n AS 别名n ON 连接条件 [WHERE 分组前筛选条件] [GROUP BY 分组字段] [HAVING 分组后筛选条件] [ORDER BY 排序字段] [LIMIT 显示行数]
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
例如:X=(1,2), Y=(a,b) 则X×Y=((1,a),(1,b),(2,a),(2,b))
功能:将2张及以上的表格按照连接条件连接为1张新表(取符合连接条件的部分)
语法
#语法格式 SELECT 字段列表 FROM 表1 AS 别名1 INNER JOIN 表2 AS 别名2 连接条件 INNER JOIN ... 表n AS 别名n ON 连接条件 [WHERE 分组前筛选条件 | GROUP BY 分组字段 | HAVING 分组后筛选条件 | ORDER BY 排序字段 | LIMITE 显示行数] #连接条件 - 等值连接:连接条件是等值判断 - 不等值连接:连接条件是不等值判断 - 自连接:自己连接自己,把1张表当做2张表(使用时需定义别名)
等值连接
连接类型 | 关键字 | 功能 |
---|---|---|
左外连接 | LEFT JOIN | 左边的表为主表 左边表的记录全都显示出来 右边的表只显示与条件匹配记录 右边表比左边表少的记录使用NULL匹配 |
右外连接 | RIGHT JOIN | 右边的表为主表 右边表的记录全都显示出来 左边的表只显示与条件匹配记录 左边表比右边表少的记录使用NULL匹配 |
全外连接 | UNION [ALL] | 也称联合查询 用来一起输出多个select查询结果 要求查询时多个select语句查看的字段个数必须一致 UNION关键字默认去重,可以使用UNION ALL包含重复项 |
#语法 SELECT 字段列表 FROM 表1 AS 别名1 LEFT JOIN 表2 AS 别名2 ON 连接条件 [WHERE 筛选条件] | [GROUP BY 分组] | [HAVING 分组后筛选]|[ORDER BY 排序]|[LIMIT 行数]
#语法 SELECT 字段列表 FROM 表1 AS 别名1 RIGHT JOIN 表2 AS 别名2 ON 连接条件 [WHERE 筛选条件] | [GROUP BY 分组] | [HAVING 分组后筛选]|[ORDER BY 排序]|[LIMIT 行数]
#语法: (SELECT语句 ) UNION (SELECT语句); #去除重复结果 (SELECT语句 ) UNION ALL (SELECT语句); #保留重复结果
左外连接 UNION 右外连接 实现全外连接
如下,把要得出结果的句子直接用()括起来
SELECT d.dept_id,d.dept_name,(SELECT COUNT(e.name) FROM employees AS e WHERE e.dept_id=d.dept_id) AS 人数 FROM departments AS d;
如果我们把数据只存储在一个地方,如果物理机器损坏,会导致数据丢失,无法恢复。 还有就是我们每次手动修改线上数据之前,为了安全起见,都需要先备份数据。防止人为的误操作,导致弄脏数据或弄丢数据。
逻辑备份是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现。
参数 | 缩写 | 含义 |
---|---|---|
--host | -h | 服务器IP地址 |
--port | -P | 服务器端口号 |
--user | -u | MySQL 用户名 |
--pasword | -p | MySQL 密码 |
--databases | -B | 指定要备份的多个数据库,会添加建库语句 |
--all-databases | -A | 备份mysql服务器上的所有数据库,会添加建库语句 |
--add-drop-database | 在建库语句前添加删库语句 | |
--compact | 压缩模式,产生更少的输出 | |
--comments | 添加注释信息 | |
--complete-insert | 输出完成的插入语句 | |
--lock-tables | 备份前,锁定所有数据库表 | |
--no-create-db/--no-create-info | 禁止生成创建数据库语句 | |
--force | 当出现错误时仍然继续备份操作 | |
--default-character-set | 指定默认字符集 | |
--add-locks | 备份数据库表时锁定数据库表 | |
--single-transaction | 保证数据的一致性和服务的可用性 | |
--master-data=1 | 通常等于1,记录binlog日志位置与文件名,追加至备份文件中 | |
--fush-logs | -F | 备份之前刷新日志 |
--events | -E | 备份事件调度器代码 |
--triggers | -T | 备份触发器 |
--routines | -R | 备份存储过程和存储函 |
备份所有数据库:
[root@localhost ~]# mkdir -p /backup/mysqldump [root@localhost ~]# mysqldump -uroot -p --all-databases >/backup/mysqldump/all.sql
备份指定数据库:
[root@localhost ~]# mysqldump -uroot -p test >/backup/mysqldump/test.sql
备份指定数据库指定表(多个表以空格间隔)
[root@localhost ~]# mysqldump -uroot -p test tb1 tb2 >/backup/mysqldump/tables.sql
备份指定数据库排除某些表
[root@localhost ~]# mysqldump -uroot -p test --ignore-table=test.tb1 --ignore-table=test.tb2 >/backup/mysqldump/test2.sql
全量备份后,数据库中的新数据依靠数据库本身的日志进行恢复。 导入时,先导入全量备份数据,在从数据库日志导入增量数据。
冷备份: 停机,复制数据文件
热备份: 不停机备份
逻辑备份: mysqldump,将数据备份出来生成sql脚本
物理备份: 直接复制数据文件 冷备(cp) 热备(xtrabackup)
全量备份: 备份全部数据 mysqldump逻辑备份 xtrabackup物理备份
增量备份: mysqldump + 二进制日志 xtrabackup直接做增量备份,再合并到全量备份中
“主”指的是MySQL主服务器(master),负责写请求。“从”指的是MySQL从服务器(slave),负责读请求。主从同步指的是将主服务器上的数据同步至从服务器。
针对大流量,一台服务器已经不能满足要求。这个时候往往是将MySQL集群部署,但是这样会存在数据一致性的问题,即客户端相同的请求,访问不同的节点,如何能够得到相同的访问结果。通常的部署架构有一主多从和多主多从。
一主多从,主服务器负责写请求,从服务器负责读请求,从服务器的数据同步自主服务器。每台服务器都拥有所有的数据,因此可以解决数据一致性问题。使用多台服务器共同来处理请求,也达到了负责均衡的效果,之所以从服务器比主服务器多,原因是实际生产中,读请求远多于写请求。
多主多从,一主多从在业务量大的时候,主库的写入速度就会成为性能瓶颈。这个时候可以使用分库分表,让数据分布在多个master中,每个master又有多个从库,负责写请求。那么client端在请求数据时,怎么知道数据在哪个节点上呢?对于分库分表,每个表都会有一个字段作为分库键,中间件(比如MyCat)在查询时会根据分库键计算出数据在哪一个库上。
面对越来越大的访问压力,单台的服务器性能成为瓶颈,需要分担负载。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库的“读”(读10000条数据可能只要5秒钟)。 所以读写分离,解决的是,数据库的写入,影响了查询的效率。
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
读写分离解决的是,数据库的写操作,影响了查询的效率,适用于读远大于写的场景。读写分离的实现基础是主从复制,主数据库利用主从复制将自身数据的改变同步到从数据库集群中,然后主数据库负责处理写操作(当然也可以执行读操作),从数据库负责处理读操作,不能执行写操作。并可以根据压力情况,部署多个从数据库提高读操作的速度,减少主数据库的压力,提高系统总体的性能。
读写分离提高性能的原因:
(1)增加物理服务器,负荷分摊;
假如我们有1主3从,假设现在1分钟内有10条写入,150条读取。那么,1主3从相当于共计40条写入,而读取总数没变,因此平均下来每台服务器承担了10条写入和50条读取(主库不承担读取操作)。因此,虽然写入没变,但是读取大大分摊了,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了,也就是拿机器和带宽换性能。
(2)主从只负责各自的写和读,极大程度的缓解锁争用;
(3)从库可配置MyISAM引擎,提升查询性能以及节约系统开销;
(4)主从复制另外一大功能是增加冗余,提高可用性,当一台数据库服务器宕机后能通过调整另外一台从库来以最快的速度恢复服务。
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。
因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。而mysql主从复制是对数据库中的数据、语句做备份。
配置好了 MySQL 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡。 读写分离和负载均衡 是MySQL集群的基础需求,MaxScale 就可以帮着我们方便的实现这些功能。
MaxScale 是MySQL的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟。MaxScale 是插件式结构,允许用户开发适合自己的插件。
初始化数据库-》主机配置srever-id和log-bin-》uuid-》从机配置server-id和log-bin
从机uuid重新生成-》重启从机-》master配置-》slave配置——》验证