mysql基础

mysql基础

学习完old的dba教程已经有一段时间了,但是因为生病和偷懒一直没能把笔记本上的东西整理出来,今天终于迈出了第一步,希望自己能够坚持下去

一个请求经历了什么

当我们发送一个请求到mysql时,mysql的内部经历了以下过程
sql层 ->语法检查 -> 语义分析 -> 权限检查 -> 解析器(生成执行计划) -> 优化器(选择执行计划) -> 执行器(进行查询得到执行结果) -> 生成缓存(如果开启了query_catche) -> 日志记录

mysql的逻辑结构

库 : 库名+库属性
表 : 表名+表属性 + 表内容 + 列

mysq的物理结构

mysql的物理结构可以概括为段、区、页
首先我们笼统的说一下这些概念

段 : 这里段的概念就是 “表”,一个段是由一个或多个区组成的,当我们存储的数据超过一个区的大小时,就会自动申请新的区存储数据

区 : 区又叫做"簇",它是由64个页(page)组成的,默认大小为1M

页 : 一个页是由4个block组成,大小为16kb,它是mysql中最小的io单元,即我们读取数据的时候会把该数据所在的整个页中的数据都读取出来

在计算机的硬盘存储结构存在扇区的概念,如图mysql基础_第1张图片
硬盘在读取数据的时候磁头每次读取的数据量就是一个扇区(硬盘的最小存储单位),一个扇区的大小通常为512byte(现在新的硬盘每个扇区有4K)
然后由8个扇区组成了一个block (4kb),
再由4个block组成mysql中的页page(16kb),我在后续的整理资料进一步学习中发现很多人把mysql中的页也成为block,这里不是特别清楚到底是谁的错误,如果有大神还希望指教一下

那么我们有上述可得到mysql的物理机构从硬盘的最小存储单位向上依次为

扇区(512byte)*8 -> block(4kb)*4 -> page(16kb) *64 -> 区(1M) *N -> 段

上面我们讲到每当数据存储达到一定量的时候mysql就会申请 一个新的区用于存储数据,因此我们可以知道在mysql的物理存储结构中,段并不一定是由硬盘中存储位置联系的区组成的,但是 区以下并包括区 他们的存储位置是连续的.

mysql不同存储引擎的文件格式

myisam : myisam引擎的数据由三个格式的文件进行存储,分别为:
*.frm : 列的相关信息,记录字段的相关描述
*.MYD : 数据
*.MYI : 索引信息

Innodb : Innodb有两个格式的文件进行存储,分别为:
*.frm : 列的相关信息,记录字段的相关描述
*.ibd : 数据行 + 索引

mysql8.0与之前版本在创建用户时的不同

8.0之前的版本在创建用户的时候就可以给该用户赋予权限,而8.0则必须创建完成后才可以
8.0之前版本:

mysql> grant all on wordpress.* to lucksun@'10.0.0.%' identified  by '123';

8.0:

mysql> create user lucksun@'10.0.0.%' identified by '123';
grant all privileges on *.* to 'lucksun'@'10.0.0.%' ;

分配权限时需要注意的点

分配的权限中 : with grant option指的是可分配权限的权限,差不多就是管理员的意思,如果有这个权限就可以给其他账号分配权限,需要注意

分配权限的语法为:

mysql> grant 权限1,权限2,on 对象(库或者表) to 用户;
对象:
*.* : 代表所有的库和表的权限
库.* : 代表某个库下的所有表的权限
库.表 : 代表某个库下的某个表的权限

如果我们需要查询某个用户的权限可以使用命令

show grants for lucksun@'10.0.0.%';

mysql中存在四个授权表分别为:
user : 可以看到授权*.*的用户
db : 授权了某个库的用户
table_priv : 授权了某个表的用户
columns_priv : 授权了某个列的用户
这四张表是存储在mylsq库下的,每次启动的时候会加载到内存当中

回收权限

mysql回收权限是无法通过覆盖写入的方式(即重复授权)进行回收权限的,只能通过对应的命令进行回收

revoke  delete on app.*  from app@'10.0.0.%';//回收了删除权限

本地数据库忘记密码

[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &

//--skip-grant-tables代表跳过授权表
//--skip-networking跳过tpc连接,防止远程登录
mysql> flush privileges;    //手工加载授权表
mysql>  alter user root@'localhost' identified by '123456';
[root@db01 ~]# pkill mysqld
[root@db01 ~]# systemctl start  mysqld

mysql登录

mysql在登录的时候如果有时候没有配置soket文件的话需要手动的指定soket文件位置

mysql -uroot -p -S /tmp/mysql.sock

还可以在不登录的情况下运行sql语句

mysql -uroot -p -e "select user,host from mysql.user;"

soket的链接参数有以下一些主要参数
-u : 用户名
-p : 密码
-S : soket文件位置(此处为大写S)
-h : ip地址
-P : 指定端口(大写P)
-e : 免交互执行命令
< : 导入脚本

你可能感兴趣的:(知识整理,mysql,数据库,php)