【MySQL】mysql面试相关问题(范式,事物,视图,索引)

版权声明:尊重原作者,转载请在文章头部注明网址。 https://blog.csdn.net/u013034226/article/details/85392995

三大范式:

1、单个字段不能继续拆分,(个人理解:列具有原子性)

2、在第一范式的基础上,每个表只描述一件事情。可以理解为第二范式就是要有主键,要求其他字段都依赖于主键。

为什么要有主键——没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要有主键。
其他字段为什么要依赖于主键——因为不依赖于主键,就找不到他们。更重要的是,其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依赖于主键,也就成了唯一的。

举例:
学生信息组成学生表,姓名可以做主键么?
不能!因为同名的话,就不唯一了,所以需要学号这样的唯一编码才行。
那么其他字段依赖于主键是什么意思?
就是“张三”同学的年龄和性别等字段,不能存储别人的年龄性别,必须是他自己的,因为张三的学号信息就决定了,这行记录归张三所有,不能给无关人员使用。

3、在第二范式的基础上,表中不能存在冗余字段(字段与字段之间不能冗余)

三范式就是要消除传递依赖,方便理解,可以看做是“消除冗余”。
消除冗余应该比较好理解一些,就是各种信息只在一个地方存储,不出现在多张表中。
比如说大学分了很多系(中文系、英语系、计算机系……),这个系别管理表信息有以下字段组成:
系编号,系主任,系简介,系架构。
那么再回到学生信息表,张三同学的年龄、性别、学号都有了,我能不能把他的系编号,系主任、系简介也一起存着?
如果你问三范式,当然不行,因为三范式不同意。
因为系编号,系主任、系简介已经存在系别管理表中,你再存入学生信息表,就是冗余了。
三范式中说的传递依赖,就出现了。
这个时候学生信息表中,系主任信息是不是依赖于系编号了?而这个表的主键可是学号啊!
所以按照三范式,处理这个问题的时候,学生表就只能增加一个系编号字段。
这样既能根据系编号找到系别信息,又避免了冗余存储的问题。

三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

关于三大范式通俗理解的参考:https://blog.csdn.net/q957967519/article/details/81910547

事物的四大特性ACID:

1. 原子性(Atomicity)
>一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性,原子性关注的是状态

2. 一致性(Consistency)
>数据库总是从一个一致性的状态转换到另一个一致性的状态。事务执行的前后都是合法的数据状态,不会违背任何的数据完整性,这就是“一致”的意思。当然这个含义中也隐含着对开发者的要求,就是不能写出错误的事务逻辑,比如银行的转账不能只加钱不减钱,这是应用层面的一致性要求。一致性关注数据的可见性。

3. 隔离性(Isolation)

扫描二维码关注公众号,回复: 4871849 查看本文章

>通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

4. 持久性(Durability)

>一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)当事务被提交后就无法再回滚,如果想要撤销一个已经提交的事务,那就只能执行一个效果与其相反的事务,这也是持久性的一种体现。

注意:

原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见 。

视图:

视图是一种基于查询结果产生的虚拟表,视图是一个虚拟表,实际它就是一条被封装起来的 SQL 查询语句。
- 在使用视图时,就相当执行了被封装的复杂SQL查询语句。
- 视图不存储具体的数据。
- 视图的基本表发生变化,那么视图也随之变化 
- 通过视图可以对用户展示指定字段从而屏蔽其他字段数据,更加安全

索引:

什么是索引:能够快速查询数据的线索就称之为索引,目的在于提高查询效率。

索引的使用:

+ 查看表中已有索引 :`show index from 表名`
+ 创建索引
`create index 索引名称 on 表名(字段名称(长度))`
    - 如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
    - 字段类型如果不是字符串,可以不填写长度部分

+ 删除索引:
`drop index 索引名称 on 表名;`

索引的缺点:

第一, 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 
第二, 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 
第三, 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
注意:

1. 索引可以明显提高某些字段的查询效率。
2. 但不是所有的表都需要建立索引 
3. 如果表中数据很少,没有必要建立索引
4. 如果一个表中的数据增删很频繁,不能建立索引 ,因为只要数据发生增减,索引就要重新建立。增加了系统开销,反而慢了
5. 索引只适合查询操作频繁的表

猜你喜欢

转载自blog.csdn.net/u013034226/article/details/85392995
今日推荐