当前位置:网站首页>MySQL架构

MySQL架构

2022-07-07 21:52:00 逆方向的钟197

复习笔记

安装这里用的docker安装这里不多阐述详细:Docker安装mysql5.7(开启binlog功能、修改字符)_逆方向的钟197的博客-CSDN博客_docker mysql 开启binlog

目录

1.MySQL字符集相关操作

2.SQL大小写规范

3.SQL_mode合理设置

4.MySQL的数据目录

5.数据库和文件系统的关系

6.数据库在文件系统的表示

 7.用户与权限管理

7.1用户管理

7.2权限管理

7.3权限表

8.角色管理

9.配置文件使用

10.逻辑架构

11.SQL执行流程

12.存储引擎操作 

13.存储引擎介绍


1.MySQL字符集相关操作

补充:5.7的版本查看字符集:

show variables like 'character%';
或
show variables like '%char%';

 各级字符集

1服务器级别、2数据库级别、3表级别、4列级别        各集字符集都可以设置字符集

2.SQL大小写规范

windows下大小写不敏感,在linux下大小写敏感

0表示大小写敏感,1表示大小写不敏感

#查看是否敏感
SHOW VARIABLES LIKE '%lower_case_table_names%'

windows

linux

Linux规则:

1、数据库名、表名、表的别名、变量名是严格区分大小写的;
2、关键字、函数名称在 SQL 中不区分大小写;
3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;

Widows规则:

不区分大小写在


设置Linux的大小写敏感

在mysql5.7中:需要my.cnf的配置[mysqlId]中加入lower_case_table_names=1并重启服务器

在mysql8.0中:需要先删除/var/lib/mysql目录,然后再修改配置文件,启动mysql

SQL编写建议

1.再关键字和函数名称全部大写

2.数据库名,表名,表别名,字段名等全部小写

3.sql语句必须以;结尾

3.SQL_mode合理设置

主要功能设置不同程度的数据校验

宽松模式:

举例:设置name char(3),插入时候超多3,比如abc123,这时候插入不会报错,且只会插入abc

主要使用:数据迁移

严格模式:

对于宽松模式这样会报错就是严格模式


查看和设置

查看

select @@session.sql_mode;
或
select @@global.sql_mode;
或
show variables like 'sql_mode';

临时设置

set SESSION sql_mode='STRICT_TRANS_TABLES'; #全局 
set GLOBAL sql_mode='STRICT_TRANS_TABLES'; #当前会话

永久设置

在my.cnf配置文件中修改,再重启

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR _DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

4.MySQL的数据目录

windows下

 Linux下

linux查看mysql相关文件                 find / -name mysql

 查看数据库存放路径                show variables like 'datadir'

5.数据库和文件系统的关系

查看默认数据库                        show        database

6.数据库在文件系统的表示

两个存储引擎Innodb,MyIsAM

Innodb :

5.7:

ibdata1            位置:/var/lib/mysql/qing    系统的表空间,存放表数据的

表名.frm          描述表结构的文件
表名.ibd          表示表的独立空间,用来存储对应 表名.frm的数据和索引,独立表空间

系统表空间和独立表空间设置,在my.cnf

[server] 
innodb_file_per_table=0 # 0:代表使用系统表空间; 1:代表使用独立表空间

查看默认情况

show variables like 'innodb_file_per_table';

 8.0:

在8.0中 .frm和.ibd合并了,就只有.ibd了

 证明合并:

ibd2sdi --dumpfile=文自己创建件名.txt 要解析的文件.ibd

MyIsAM:

特点:数据和索引分开存储

创建表:

5.7:

创建后文件有三个

student_myisam.MYD  #存表数据
student_myisam.MYI	#存储索引
student_myisam_363.frm

8.0:

区别5.7  .frm变成了.sdi

 7.用户与权限管理

7.1用户管理

通常使用mysql -u root -p 密码

完整版登录

mysql -h 主机名(默认localhost) -P 端口号 -p 密码 数据库名 -e sql语句;

查看用户

use mysql;
select Host,User from user;

添加用户

# %表示任意地址都可以访问
create user 'qing' identified  by '123456';
# 表示只支持本地的连接
create user 'qing'@'localhost' identified  by '83348535';

查看当前用户权限

# 查看权限
show grants ;

修改用户名

# 修改用户名
update mysql.user set User='ming' where User='qing';

刷新权限

# 刷新权限
flush privileges ;

删除账户

# 删除账户
drop user 'ming';
drop user 'ming'@'localhost';

修改当前用户密码

# 设置当前用户的密码
alter user user() identified by '83348535';
#修改当前密码
set password ='abc';

修改其他用户密码

use mysql;
desc user;
#密码经过特殊的加密处理
select Host,User,authentication_string from user;
# 修改其他用户密码
alter user 'qing'@'%' identified by '123456';
set password for 'qing'@'%'='密码';

7.2权限管理

刚开始创建用户的时候,这时候需要对该永福赋予权限

 展示当前用户权限

# 查看权限
show grants ;
# 或 
SHOW GRANTS FOR CURRENT_USER; 
# 或 
SHOW GRANTS FOR CURRENT_USER();
#查看所有权限列表
show privileges;

查看用户的全局权限

SHOW GRANTS FOR 'user'@'主机地址' ;

权限授予原则:

1.满足需求的最小权限

2.限制用户的登录主机,限定io或者内网IP段

3.设置满足密码复杂度的密码

4.定期清理不需要的用户

权限授予

ps:创建的用户没有办法再给别的创建用户,如果把自己的权限也给别

REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;

的需要添加参数

with grant option

举例:

GRANT SELECT,INSERT,DELETE,UPDATE ON  数据库.表 TO '[email protected]'@'%' 
​​​​​​​# 把所有权限都赋给qing用户
grant all privileges on *.* to 'qing'@'%';

收回权限

REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;

举例:

ps:重新登陆才有用

#收回全库全表的所有权限 
REVOKE ALL PRIVILEGES ON *.* FROM [email protected]'%'; 
#收回mysql库下的所有表的插删改查权限 
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM [email protected];

7.3权限表

mysql通过权限表来控制用户对数据的访问,权限表存放再mysql数据库中,mysql根据权限表内容为每个用户赋予响应的权限,这些权限重要的为,user表,db表,prcs_priv(存储过程和存储函数设置操作权限),tables_priv(表的权限),colums_priv(列的权限)

user表:

 db表:

表示对具体的某一个数据库权限的问题

desc tables_priv;

表示具体都一个表的对应权限

 desc columns_priv;

对应数据表的对应的字段是否有权限

desc procs_priv;

对存储过程和存储函数设置操作权限

8.角色管理

8.0新引入的概念,从oracle借鉴过来的概念

概念:角色是权限的集合,可以为角色添加或移权限,用户被赋予角色,同时也被赋予觉得的权限。并且像账户一样,角色拥有被授予和撤销。

简单说:mysql里面有多个账户,账户里面有多个角色

ps:角色在创建的时候并没有对应的权限,需要自己激活

创建角色

# 创建角色 多个角色用,号连接
create role 'manager'@'%';
# 赋予权限
grant select,update on 数据库.* to '角色';

查看角色权限

show grants for '角色'@'%';

回收权限

REVOKE 权限 ON 表名FROM '角色';

举例:

#撤销权限
REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';
#查看权限
SHOW GRANTS FOR 'school_write';

 删除角色

#多个用,相连
DROP ROLE '角色';

给用户赋予权限

GRANT '角色' TO '被授予的角色'@'localhost';
SHOW GRANTS FOR '被授予的角色'@'localhost';

激活角色

1.管理员激活

#使用set default role 命令激活角色
SET DEFAULT ROLE ALL TO '角色'@'localhost';

2.参数设置,默认激活

#查看是否激活
show variables like 'activate_all_roles_on_login';
#把off改成on
SET GLOBAL activate_all_roles_on_login=ON;

撤销用户激活

REVOKE role FROM user;

举例:

#撤销用户信息
#撤销kangshifu用户的school_read角色。
REVOKE 'school_read' FROM '角色'@'localhost';
#查看
SHOW GRANTS FOR '角色'@'localhost';

设置强制角色(mandatory role)

强制角色是给每个创建账户的默认角色,不需要手动设置,强制角色无法被revoke(撤销)或者drop(删除)

方式1:修改my.cnf配置,服务启动前设置

[mysqld] 
mandatory_roles='role1,[email protected],[email protected]%.atguigu.com'

方式2:运行时设置

#系统重启后仍然 有效
SET PERSIST mandatory_roles = 'role1,[email protected],[email protected]%.example.com'; 
#系统重启后失效
SET GLOBAL mandatory_roles = 'role1,[email protected],[email protected]%.example.com'; 

9.配置文件使用

9.1配置文件格式

#具体的启动选项
[server]
#具体的启动选项
[mysqld]

[mysqld_safe]

[client]

[mysql]

[mysqladmin]

10.逻辑架构

执行顺序

1.Mysql服务器之外的客户端程序 -> 2.连接池 -> 3.SQL接口-> 4.查询缓存 -> 5.解析器 -> 6.优化器-> 7.插件的存储引擎 -> 8.文件系统 -> 9.查询缓存 -> 10.sql接口 

主体分三层

连接层->服务层->引擎层

连接层

连接MYSQL服务器之前,做TCP连接,三次握手之后对账号和密码做验证

用户密码不对,收到Access denied for user错误,客户端程序结束执行

用户密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都依赖此时督导权限

主要创建两个池子 1)连接池 2)线程池

服务层

SQL Interface: SQL接口

1)接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT ... FROM就是调用SQL Interface

2)MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定
义函数等多种SQL语言接口
Parser: 解析器
1)在解析器中对 SQL 语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构
传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错
误,那么就说明这个SQL语句是不合理的
2)在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建 语法树 ,并根据数据字
典丰富查询语法树,会 验证该客户端是否具有执行该查询的权限 。创建好语法树后,MySQL还
会对SQl查询进行语法上的优化,进行查询重写。
Optimizer: 查询优化器
1)解析之后,查询之前生成执行计划
2)计划表明使用那些索引进行查询全表检索、索引检索),表之间的连接顺序如何,最后按照执行计划的步骤调用存储引擎提供的方法执行擦汗寻,并返回结果
3))采用选取-投影-连接策略
指令
#mysql8.0查看执行计划是否开启
select @@profiling;
#profiling=0表示关闭,1表示开启
show variables like 'profiling';
#开启实行计划
set profiling=1;

Caches & Buffers: 查询缓存组件

1)MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过
程了,直接将结果反馈给客户端
2)缓存机制组成由表缓存,记录缓存,key缓存,权限缓存等组成
3)不同客户端之间共享
4)5.7之后不推荐使用,在8.0中删除
引擎层
真正的负责了MySQL中数据的存储和提取,对物理服务器级别 维护的底层数据执行操作
#显示存储引擎
show engines;

11.SQL执行流程

ps:查询缓存8.0被抛弃掉了,命中率低,要求两个语句必须一样,默认关闭

查询缓存 

指令

#查看是否开启缓存
show variable like '%query_cache_type'
#查看缓存
show status like'%Qcache%'

解析器

对sql进行解析分析

词法分析:那些是关键字,那些是字段

语法分析:语法是否满足

优化器

在优化器中会确定 SQL 语句的执行路径,比如是根据 全表检索,还是根据 索引检索等。

在查询优化器中,可以分为 逻辑查询优化阶段和 物理查询 优化阶段。

执行器

查看权限、调用存储引擎比如InnoDB、MyISAM等然后再调用存储引擎系统

主要流程

12.存储引擎操作 

存储引擎是表示表的结构,不同存储引擎表示不同的结构

查看引擎

show engines;
#或者
show engines \G;

 

查看默认存储引擎

show variables like '%storage_engine%'; 
#或
SELECT @@default_storage_engine;

 修改默认存储引擎

1)直接修改

SET DEFAULT_STORAGE_ENGINE=MyISAM;

2)修改配置文件

default-storage-engine=MyISAM 
# 重启服务 
systemctl restart mysqld.service

创建指定存储引擎

CREATE TABLE 表名( 
建表语句;
 ) ENGINE = 存储引擎名称;

修改表的存储引擎

ALTER TABLE 表名 ENGINE = 存储引擎名称;
#修改完查看表结构
SHOW CREATE TABLE 表名

13.存储引擎介绍

InnoDB 引擎:具备外键支持功能的事务存储引擎
优点:
        1.默认事务型引擎,被设计用来处理大量短期的事务,可以确保事务的完成和回滚
        2.除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎
        3.数据文件结构         表.frm   存储表结构  表.ibd  存储数据和索引
        4.InnoDB是 为处理巨大数据量的最大性能设计
缺点:
        1.对比MyISAM的存储引擎,InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以           保存数据和索引。
        2.MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据,对存要   求较高 ,而且内存大小对性能有决定性的影响。
MyISAM 引擎:主要的非事务处理存储引擎
特点:
1.MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级 锁、外键 ,有一个毫无疑问的缺陷就是 崩溃后无法安全恢复
2.优势是访问的 速度快 ,对事务完整性没有要求或者以SELECTINSERT为主的应用

3.针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高

4.表结构 表.frm 存储表结构         表.MyD  存储数据       表.MYI 存储索引

应用:只读应用或者以读为主的业务

Archive 引擎:用于数据存档

Blackhole 引擎:丢弃写操作,读操作会返回空内容
CSV 引擎:存储数据时,以逗号分隔各个数据项
Memory 引擎:置于内存的表
Federated 引擎:访问远程表
Merge引擎:管理多个MyISAM表构成的表集合
NDB引擎:MySQL集群专用存储引擎

 

 

 

 

 

 

 

原网站

版权声明
本文为[逆方向的钟197]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_46549023/article/details/125618750