数据库相关知识学习——基于mysql

基于mysql的学习和使用

1.数据库三方式

第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性);
第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。
第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)

2.事务基本特征

原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。
隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

3.数据库的基本架构

存储模块 缓存机制 SQL解析 日志管理 权限划分 容灾机制 索引管理 锁管理

4.数据库索引

1.什么是索引?

索引是帮助MySQL高效获取数据的排好序的数据结构

2.常见的数据结构

二叉树:
用树形的结果存储数据,左边小,右边大
平衡二叉树:
解决二叉树单边失衡的问题,会自动旋转调整节点
B树(多叉平衡二叉树):
叶节点具有相同的深度,叶节点的指针为空
所有索引元素不重复
节点中的数据索引从左到右递增排列
B+树:
非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指引连接,提高区间访问的性能,mysql底层采用B+树

3.MySQL 数据引擎

Innodb:聚集索引 如果没有主键索引 他会先查询到相关值所在的主键所以为主,在进行主键索引查找(两次 第一次找到的是主键索引的位置 第二次通过主键索引查到数据)
若一个主键被定义,该主键则作为聚集索引
若没有主键被定义,该表的第一个唯一非空索引则作为聚集索引
若不满足上述条件,innodb内部会生成一个隐藏聚集索引
非主键索引存储的是其对应的主键值,包含两次查找
Myslam:非聚集索引

Innodb:如果用到索引是行级锁 没有用到索引是表级锁,innodb是事物提交
mysalm:表锁 读锁---共享 锁(在进行读的时候 还可以进行读 写不行)
			写锁---排他锁(在进行写的时候 不可以读和写)
共享锁与共享锁不冲突 共享锁与排他锁冲突 排他锁与排他锁冲突

Innodb:
数据增删改频繁
可靠性要求高

Myslam:
频繁执行全表count语句
对数据进行增删改的频率不高 查询频繁
没有事务

4.数据库事务隔离级别

1.事务并发带来的问题

脏读
1.张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)
2.张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)
3.而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。
虚读(幻读)
目前工资为4000的员工有10人。
1.事务1,读取所有工资为4000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为4000
3.事务1再次读取所有工资为4000的员工共读取到了11条记录,
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。
不可重复读
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
第二类丢失更新
多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变
脏读是针对事务回滚读取到不应该存在的数据,不可重复读是读取到修改后的数据,幻读针对的是数据总的数量
丢失更新针对的是覆盖的值

2.事务隔离机制

image.png
mysql是REPEATABLE-READ

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读