多表连接是学习难点,内外链接,左右外链接
三大范式,遵守范式可以让数据库更加精简规范,但是会让我们查询的内容分到多张表,就会用到多表链接
学生表和课程表
考试成绩表,课程表
学生姓名考的课程名称以及分数,三表链接
还需要查课程名称
修改成这样
显示如下
如何实现
先左连接再去union
学生表和讲师表分别作出然后进行union
也可以实现
如何实现,没有交集,没有老师的学生,没有学生的老师
权限
grant option是授权用户做一件事,这个用户还可以授权给别人
对于某一个资源有完全的权限ALL PRIVILEGES 或ALL
‘grant是授权
数据库级别
- 和*。*应该是一样的
- 授权某一个数据库db_name
可以具体到表tbl_name
routine_name 存储过程,函数
查询频率
多少个用户selectse
查询现在mysql数据库里有多少用户
来指定创建新的用户
在7的机器上能够登录,说明有时候flush也会自动
但是看到的数据库好像不一样
所以create创建的用户权限是比较小的
想要授权管理hellodb
星点星是所有数据库的所有资源
就认为是创建两个用户
wang账户访问优先大权限
但是输入的密码是centos
表面上是大权限,但是实际上是小权限的密码
用户名一样,输入进去,默认得到的是大权限,所以尽量不要去这么设置
现在已经授权了wang用户,但是把一个用户删除
剩下的用户是大的权限
也可以单独设置他的某些操作
授权对某个数据库一些权限
根据刚才授权是可以查询和插入数据
删除是不行的
![
查插入可以
通过这种授权可以精确到字段
可以授权某个用户对某个表的某个字段可以查询
新创建用户
全选查是不可以的,只能挑着查
也可以取消权限
可以查看权限,ALL privileges 是全部权限
revoke取消权限,取消delete权限
针对hellodb的删除权限删除
取消了再来看看权限
就没有了delete
列出的这些就等于这些加上delete等于所有权限ALL PRIVILEGES
current_user查看当前用户权限是什么
这个授权是把信息放到什么地方呢
查看user表,存放了用户信息
这些表里有些是存放了用户的授权的
刚才给某个用户设置了列权限
查看columns_priv表结构
查看到了授权,对用户授权的列信息是放在这里的
proc_priv存储过程的权限
mysql数据库如果被破坏了,那么授权的信息也没了,所以要加以备份
既然是存在表里,那么就可以通过直接修改表结构的方法来修改权限
不用命令的方式,这种操作一般就需要配合flush进行操作,因为不是实时的
最简单创建用户权限的写法
通过连接管理模块,让用户可以连接到数据库进行操作
mysql是多线程,要管理线程就是线程管理模块,连接一个用户就要消耗一个线程,所以有一个线程池,通过线程池,当新用户发送请求的时候从线程池中抽取出一个线程来给用户提供服务
还有命令分发器,用户执行指令有一个分发器,不仅要执行指令,还要把一些结果缓存下来
查询缓存模块,查询表里的内容,如果还想要访问,就可以缓存下来,提高速度,不用跑到慢速磁盘上找
日志记录模块,对数据库的操作都有记录,尤其增删改,不记录就有可能造成破坏,比如事务日志,事务要实现ACID特性,才能对日志保持跟踪,保证数据的完整性,没日志怎么撤销
用户管理模块,创建用户
收到命令以后,还需要解析执行
要做优化,对表修改,表维护,去复制,状态模块,查看
还有访问控制权限模块 grant revoke 授权和取消权限
表管理模块,对表里的内容进行增删改
要进行修改的最后还是要体现在磁盘上的,就需要有存储引擎的接口,来负责最后保存到磁盘物理类存储设备来进行交互,不同的存储引擎在磁盘上保存的人家格式是不一样的
mysql存储引擎是插件式的
myisam是系统相对历史悠久的引擎,在教老的版本中默认用的是myisam,号称高性能
在新一点版本已经用的iinnodb了
没有事务是比较危险的,加入写数据写了一半停电了,再去重启机器,MYisam就没有任何办法
innodb有事务的日志可以撤销,rollback
**锁级别
myisam是表级锁, 带来的 就是并发用户访问受到很大的影响
innodb是行级锁,就可以一个改10行, 一个用户改1行,不冲突
粒度越小,越精细,myisam比较粗
mVCC
很重要,可以支持多个用户同时去修改数据,并且不会造成影响
**
mvcc内部机制是,同时有多个事务操作数据库,
每条数据有创建日期和删除日期
如果有4号事务在操作数据库,下面的 对于4号,可以看到哪些事务
事务有隔离性,在4看的时候。56还没发生,所以只能看到123
下面这种情况应该看到什么,145
全文索引,比如在一个文章里搜一个字符串
聚簇索引,
外键
存储引擎是和表相关的不是和库相关的,在创建表的时候要指定表的引擎
创建表的时候存储引擎的定义
help create table
一般来讲一个数据库最好放一种存储引擎,不混着用
在mysql库都是用的myisam
每个myisam数据库表里的文件都是三个表文件的格式
基于myisam创建的脚本
需要修改下创建的数据库名字
有一个myisam
每个文件都有三个格式的文件
innodb存储的文件是有一定的要求
INNODB是存放两个地方,表的定义是frm
数据是存放在ibddata1的
都放在一起显然管理很乱,在创建一个hellodb2
创建之前先看一下大小
再执行一次查看有没有变化
是因为18M数据库文件足够放我们的 数据,没有把文件撑大
都放在一起管理起来不方便,如果要备份 表就需要把这个就都放在一起
所以我们要把数据库的每张表存放在单独的文件中
修改配置就可以了
默认就是ON
重启服务
会把以前的数据分到每个文件吗,创建一个3的数据库
多了个ibd文件
这是推荐的做法
在数据库创建的时候就需要加一下,因为后面加了前面的就不生效了
适合的版本
版本说明
生产中建议加上
可以查看否启用 的
其他的引擎做为了解
这个存储引擎给特殊的 使用的
cluster/NDB是做集群用的
blackhole 黑洞引擎,主从复制使用
但是这样从主服务器同步,压力太大,就可以换下面的方式
中间就可以用blackhole把数据都放在内存里提高速度
、
学习数据库存储引擎
老版本想要设置INNOdb,就需要加配置文件
修改成功
面试题就会问你聊聊mysql有哪些存储引擎