mysql高级篇(一)

一、mysql架构

1、 mysql高级简介

  1. 数据库内部结构和原理
  2. 数据库建模优化
  3. 数据库索引建立
  4. SQL语句优化
  5. SQL编程(自定义函数、存储过程、触发器、定时任务)
  6. mysql服务器的安装配置
  7. 数据库的性能监控分析与系统优化
  8. 各种参数常量设定
  9. 主从复制
  10. 分布式架构搭建、垂直切割和水平切割
  11. 数据迁移
  12. 容灾备份和恢复
  13. shell或python等脚本语言开发
  14. 对开源数据库进行二次开发

2、 mysql 的用户与权限管理

2.1、mysql的用户管理

2.1.1、创建用户

create user zhangsan identified by '123123';

2.1.2、user表

select host,user,authentication_string,select_priv,insert_priv,drop_priv from mysql.user;

在这里插入图片描述
host:表示连接类型

  • % 表示所有远程通过 TCP方式的连接
  • IP 地址 如 (192.168.1.2,127.0.0.1) 通过制定ip地址进行的TCP方式的连接
  • 机器名 通过制定i网络中的机器名进行的TCP方式的连接
  • ::1 IPv6的本地ip地址 等同于IPv4的 127.0.0.1
  • localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p 123xxx 方式的连接。

user:表示用户名
同一用户通过不同方式链接的权限是不一样的。

password:密码
所有密码串通过 password(明文字符串) 生成的密文字符串。加密算法为MYSQLSHA1 ,不可逆 。
mysql 5.7 的密码保存到 authentication_string 字段中不再使用password 字段。

select_priv , insert_priv等
为该用户所拥有的权限。

2.1.3、设置密码

修改当前用户的密码:
set password =password('123456')

修改某个用户的密码:
update mysql.user set password=password('123456') where user='li4';

flush privileges; #所有通过user表的修改,必须用该命令才能生效。

2.1.4、修改用户、删除用户

修改用户:
update mysql.user set user='li4' where user='wang5';

删除用户:
drop user li4 ;

2.2、mysql的权限管理

2.2.1、授予权限

授予权限:
grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
该权限如果发现没有该用户,则会直接新建一个用户。

比如:
grant select,insert,delete,drop on atguigudb.* to li4@localhost;
#给li4用户用本地命令行方式下,授予atguigudb这个库下的所有表的插删改查的权限。

grant all privileges on *.* to joe@'%'  identified by '123'; 
#授予通过网络方式登录的的joe用户 ,对所有库所有表的全部权限,密码设为123.

3、 mysql 的其他配置

sql_mode

MySQL的sql_mode合理设置
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

show  variables like 'sql_mode';

在这里插入图片描述
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:
禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT:
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

ORACLE:
设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

4、 mysql 逻辑架构

mysql高级篇(一)_第1张图片
1、连接层(Connectors)
最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2、服务层(MySQL Server)
2.1、Management Serveices & Utilities:系统管理和控制工具
2.1、SQL Interface:SQL接口
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
2.3、Parser: 解析器
SQL命令传递到解析器的时候会被解析器验证和解析。
2.4、Optimizer: 查询优化器
SQL语句在查询之前会使用查询优化器对查询进行优化。
2.5、Cache和Buffer: 查询缓存
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。

3、引擎层(Pluggable Storage Engines)
存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

4、存储层(File system)
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

4.1、MySQL 逻辑架构执行流程:

  1. 连接层(Connectors)
  2. 数据库连接池(Connection Pool)
  3. 读缓冲(Cache和Buffer)
  4. SQL接口分析sql(SQL Interface)
  5. 解析器解析复杂sql(Parser)
  6. 优化器生成执行计划(Optimizer)
  7. 存储引擎按计划分类型执行(Pluggable Storage Engines)
  8. 写入缓存(Cache和Buffer)
  9. 返回结果

注意:Mysql 8已废弃缓存功能

4.2、查看sql执行周期

利用show profile 查看sql的执行周期。
先开启profiling

show variables  like '%profiling%';
set profiling=1;

执行查询语句

select * from xxx ;
show profiles;     #显示最近的几次查询

mysql高级篇(一)_第2张图片

show profile cpu,block io for query 编号;  #查看程序的执行步骤

mysql高级篇(一)_第3张图片

4.3、sql执行顺序

手写

select distinct 查询列表
from1 别名
left|right|full join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后筛选
order by 排序列表
limit 分页参数;

机读

from1 别名
left|right|full join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后筛选
select distinct 查询列表
order by 排序列表
limit 分页参数;

5、 mysql 存储引擎

show engines;

mysql高级篇(一)_第4张图片

# 查看mysql当前默认存储引擎
show variables like '%storage_engine%';

mysql高级篇(一)_第5张图片

5.1、mysql存储引擎简介

5.1.1、InnoDB存储引擎

InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。

5.1.2、MyISAM存储引擎

MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。

5.1.3、Archive引擎

Archive档案存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表适合日志和数据采集类应用。
根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。

5.1.4、Blackhole引擎

Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。

5.1.5、CSV引擎

CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。
CSV引擎可以作为一种数据交换的机制,非常有用。
CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。

5.1.6、Memory引擎

如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一个数量级。

5.1.7、Federated引擎

Federated引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。

5.2、MyISAM和InnoDB

MyISAM InnoDB
外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发操作 行锁,操作时只锁住某一行,不对其他行有影响,适合高并发操作
关注点 节约资源、消耗少、简单业务 并发写、事务、更大资源
默认安装 Y Y
默认使用 N Y
系统表使用 Y N

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