面试题以及一些问题概述

wzh366 / 2024-02-27 / 原文

1 数据库三大范式是什么

数据库的三大范式是指关系数据库设计中的三个规范化级别,用于规范化数据库中的数据结构,提高数据的一致性和减少数据冗余。这三大范式分别是:

1. 第一范式(1NF):要求数据库表中的每个字段都是原子性的,不可再分。也就是说,每个字段中的数据不能包含多个值或多个属性。如果一个字段中包含了多个值,就需要将其拆分成多个独立的字段。

2. 第二范式(2NF):在满足第一范式的基础上,要求数据库表中的非主键字段必须完全依赖于主键。也就是说,每个非主键字段必须完全依赖于主键,而不能依赖于其他非主键字段。如果存在部分依赖或传递依赖的情况,就需要将其拆分成多个独立的表。

3. 第三范式(3NF):在满足第二范式的基础上,要求数据库表中的非主键字段之间不能存在传递依赖关系。也就是说,每个非主键字段之间应该是互相独立的,不能通过其他非主键字段推导出来。如果存在传递依赖的情况,就需要将其拆分成多个独立的表。

通过遵循这三大范式,可以有效地规范化数据库的结构,减少数据冗余和数据更新异常,提高数据的一致性和查询效率。但需要注意的是,过度规范化也可能导致查询复杂性增加,需要在实际设计中进行权衡。

2 mysql有哪些索引类型,分别有什么作用

Mysql索引 可以从 存储方式,逻辑角度,实际使用角度进行分类

存储方式分为  B-树索引和HASH索引两类

B-树索引可以进行全键值、键值范围和键值前缀查询,也可以对查询结果进行 ORDER BY 排序。但 B-树索引必须遵循左边前缀原则,要考虑以下几点约束:

查询必须从索引的最左边的列开始。
查询不能跳过某一索引列,必须按照从左到右的顺序进行匹配。
存储引擎不能使用索引中范围条件右边的列
——

哈希索引

HASH 索引不是基于树形的数据结构查找数据,而是根据索引列对应的哈希值的方法获取表的记录行

逻辑区分

---普通索引    

它没有任何限制,唯一任务就是加快系统对数据的访问速度。

普通索引允许在定义索引的列中插入重复值和空值。

创建普通索引时,通常使用的关键字是 INDEX 或 KEY

CREATE INDEX index_id ON tb_student(id);

 

---唯一索引

唯一索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。

创建唯一索引通常使用 UNIQUE 关键字。

CREATE UNIQUE INDEX index_id ON tb_student(id);

 

---主键索引

主键索引是一种特殊的唯一索引,不允许值重复或者值为空。

创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引

---空间索引

创建空间索引的列必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。

空间索引主要用于地理空间数据类型 GEOMETRY。对于初学者来说,这类索引很少会用到

CREATE SPATIAL INDEX index_line ON tb_student(line);

 

---全文索引

全文索引允许在索引列中插入重复值和空值。

不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

创建全文索引使用 FULLTEXT 关键字。

CREATE FULLTEXT INDEX index_info ON tb_student(info);

 

实际使用区分

单列索引

单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。

单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可

CREATE INDEX index_addr ON tb_student(address(4));

  

多列索引

多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用

CREATE INDEX index_na ON tb_student(name,address);

 

 

3 事务的特性和隔离级别   

事务的四大特性:
原子性(Atomicity):事务是最小的工作单元,不可再分。
一致性(Consistency):事务必须保证多条DML语句同时成功或同时失败。
隔离性(Isolation):一个事务不会影响其他事务的运行,互不干扰。事务之间隔离,四个隔离级别。
持久性(Durability):事务一旦提交成功,它对数据库中数据的改变就是永久性的
-----------------

第一级别:读未提交 (Read Uncommited)

对方事务还未提交,但当前事务可以读取到对方未提交的数据
读未提交存在脏读现象:表示读到了脏的数据,因为还未提交到硬盘,数据及其不稳定。(所有数据库都是从第二级别起步,第一级别太低)

第二级别:读已提交 (Read Commited)

当前事务只能读取到对方事务已经提交的数据。由于未提交的读不到,则解决了脏读现象。
存在的问题:不可重复读,即可能每次读的数据不一样,做不到数据从头到尾查的数据是一样的

第三级别:可重复读 (Repetable Read)

 

 

第四级别: 序列化(串行)读 (Serializable) (同步)

 

解决了所有问题
但是效率低,需要事务排队

 

 

 

使用第三方的话不安全怎么办?
基于官方api封装,一定意义上来说稳定,但是还是无法规避不安全的成分在,但是就算换做人工来说,相似无二。

更多 链接查看

https://blog.csdn.net/DominicJi/article/details/83861977?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E8%80%81%E7%94%B7%E5%AD%A9%E6%9C%88%E8%80%83&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-83861977.142

 

https://blog.csdn.net/CXY00000/article/details/121341136