关于mysql的知识体系

关系型数据库(二维表)

常用的SQL命令分类

  • 管理数据库使用SQL(结构化查询语言)

  • DDL 数据定义语言 如:CREATE、ALTER、DROP

  • DML 数据操作语言 如:INSERT、UPDATE、DELETE

  • DCL 数据控制语言 如:GRANT、REVOKE

  • DTL 数据事务语言 如:COMMIT、ROLLBACK、SAVEPOINT

SQL命令使用规则

  • SQL命令不区分字母大小写(密码、变量值除外)

  • 每条SQL命令以;结束

  • 默认命令不支持Tab键自动补齐

  • \c 终止sql命令

MySQL基本操作

  • 可以创建多个库,通过库名区分

  • 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; 
  • 查看表结构

  • DESC 库名.表名;
  • mysql> DESC db1.stuinfo;
  • 数据类型

  • 定长 :CHAR(字符个数)
    • 最大字符个数255
    • 不够指定字符个数时在右边用空格补全
    • 字符个数超出时,无法写入数据。
  • 变长:VARCHAR(字符个数)
    • 按数据实际大小分配存储空间(0-65535)

    • 字符个数超出时,无法写入数据。

    • 大文本类型:text/blob

    • 字符数大于65535存储时使用

  • 数据类型

    时间函数

  • 函数服务内置的命令,可以使用时间函数给字段赋值
  • 类 型 用 途
    CURTIME( ) 获取当前的系统时间"时:分:秒"部分
    CURDATE( ) 获取当前的系统时间"年-月-日"部分
    NOW( ) 获取当前系统时间"年-月-日 时:分:秒"
    YEAR(NOW()) 获取年
    MONTH(NOW( )) 获取月
    DAY(NOW()) 获取日
    DATE(NOW()) 获取日期"年-月-日"
    TIME(NOW()) 获取时间"时:分:秒"

枚举类型

  • ENUM 单选
    • 格式:字段名 ENUM(值1, 值2, 值N)
    • 仅能在列表里选择一个值

创建db1.t5表,包含name字段 CHAR类型15个宽度,sex字段单选枚举类型("boy","girl","other")

mysql> CREATE TABLE db1.t5(
       -> name CHAR(15),
       -> sex ENUM("boy","girl","other")
       -> );

约束条件

  • NULL 允许为空(默认设置)
  • NOT NULL 不允许为空
  • KEY 键值类型
  • DEFAULT 设置默认值,缺省为NULL
  • EXTRA 额外设置

高级字段约束

主键

单列主键

复合主键

自增长

外键

  • 外键约束:保证数据的一致性,外键字段值必须在参考表中字段已有值里选择,一张表中可以有多个外键
  • 表存储引擎必须是innodb (在进阶课程里讲 现在仅需要知道如何指定表使用innodb存储引擎)
  • 外键表字段与被关联表字段类型要一致
  • 被参照字段必须要是索引类型的一种(通常是PRIMARY KEY)

数学计算

#包括+、-、*、/、%操作
#SELECT可以直接运行计算表达式
#也可以对表内已有的数据进行运算

流程控制函数

  • IF函数
#语法:
	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 显示行数]

笛卡尔积

笛卡尔乘积是指在数学中,两个集合XY的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

​ 例如:X=(1,2), Y=(a,b) 则X×Y=((1,a),(1,b),(2,a),(2,b))

内连接(INNER)

  • 功能:将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语句实现数据库数据的重现。

mysqldump命令

参数 缩写 含义
--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主从同步?

“主”指的是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主从复制是对数据库中的数据、语句做备份。

最大规模

MaxScale 是干什么的?

配置好了 MySQL 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡。 读写分离和负载均衡 是MySQL集群的基础需求,MaxScale 就可以帮着我们方便的实现这些功能。

MaxScale 的基础构成

MaxScale 是MySQL的兄弟公司 MariaDB 开发的,现在已经发展得非常成熟。MaxScale 是插件式结构,允许用户开发适合自己的插件。

从模板机克隆一台新机器安装maxscale

总结过程

初始化数据库-》主机配置srever-id和log-bin-》uuid-》从机配置server-id和log-bin

从机uuid重新生成-》重启从机-》master配置-》slave配置——》验证

你可能感兴趣的:(mysql,数据库)