当前位置: 首页>编程语言>正文

Mysql数据库相关知识点(面试题)

一、关系型数据库三大范式

1NF(第一范式):属性(对应于表中的字段)不能再被分割,也就是这个字段只能是一个值,不能再分为多个其他的字段了。1NF 是所有关系型数据库的最基本要求 ,也就是说关系型数据库中创建的表一定满足第一范式。

2NF(第二范式):2NF 要求数据库表中的每个实例或行必须可以被惟一地区分,2NF 在 1NF 的基础上增加了一个列,这个列称为主键,非主属性都依赖于主键。

3NF(第三范式):3NF 在 2NF 的基础之上,要求每列都和主键列直接相关,而不是间接相关,即不存在其他表的非主键信息。

在开发过程中,并不一定要满足三大范式,有时候为了提高查询效率,可以在表中冗余其他表的字段。

二、DML 语句和 DDL 语句区别

DML(数据操作语言)和DDL(数据定义语言)是SQL中两个重要的语言分类,它们的区别在以下几个方面:

1.作用对象不同

DDL用于创建、修改或删除数据库中的对象,例如表、视图、索引等。而DML用于对这些对象中的数据进行操作,例如插入、更新、删除数据等。

2.执行结果不同

DDL执行后会改变数据库对象的结构,但是不会对数据库中原有的数据进行任何操作,因此DDL语句不会返回任何行或列。

DML执行后会对数据进行变更,因此DML语句会返回受影响的行数或者查询到的数据。

3.自动提交方式不同

DDL语句执行后会自动提交事务,即使没有显式地使用“COMMIT”命令,也会将修改持久化到磁盘上。

DML语句执行后不会自动提交事务,需要手动使用“COMMIT”或“ROLLBACK”命令来控制事务的提交或回滚。

4.锁定机制不同

由于DDL语句会修改数据库的结构,因此执行时需要对整张表进行锁定,防止其他用户对该表进行并发操作。

DML语句只会对涉及到的行或者页进行锁定,因此相对于DDL语句来说,对并发操作的影响要小一些。

综上所述,DDL主要用于管理数据库结构、表和列等对象,而DML则是用于增删改查操作。两者的执行结果、自动提交方式和锁定机制都有所不同。

三、主键和外键的区别

主键:用于唯一标识一行数据,不能有重复,不允许为空,且一个表只能有一个主键;

外键:用来和其他表建立联系,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键,外键可以理解为是一个表中的某一列,这一列的值基于另一个表中的一列的值。外键能够确保在关联表之间存在一致性,并且通过它们可以创建表之间的引用完整性约束。

总的来说,主键是用来确保行的唯一性的,而外键则用来建立表与表之间的关系。

四、drop、delete、truncate 区别

DROP,DELETE和TRUNCATE都是用于从数据库中删除数据的SQL命令,但它们具有不同的功能和使用场景。

DROP:DROP命令用于完全删除一个表、视图(View)或库(Database)。当执行 DROP 命令后,将删除整个对象,包括其结构和数据。DROP 命令无法撤消,执行后即可永久性的删除对象。

DELETE:DELETE命令用于从现有表中删除一条或多条记录。DELTE只删除表中的数据而不影响表的结构。可以通过 WHERE 子句来指定要删除的条件,如果没有 WHERE 子句,则将删除所有行。DELETE 命令执行后,被删除的数据可以使用ROLLBACK语句进行回滚。如果不使用ROLLBACK语句,则删除操作是不可恢复的。

TRUNCATE:TRUNCATE命令用于快速删除表内的所有数据,与 DELETE 不同,TRUNCATE 是直接删除表内所有数据,而不是逐行删除,因此 TRUNCATE 操作的速度比 DELETE 更快。TRUNCATE 也可以使用 ROLLBACK 进行回滚,但不能通过 WHERE 子句指定特定的行。

总之,DROP、DELETE 和 TRUNCATE 都可以用于删除数据,但在使用时应该根据实际需求选择合适的命令。如果要删除整个表或库,可以使用 DROP;如果需要删除某些行,则可以使用 DELETE;而如果希望快速清空整个表的数据,则可以使用 TRUNCATE。

五、Mysql基础架构

MySQL是一种关系型数据库管理系统(RDBMS),它由多个组件构成,这些组件一起构成了MySQL的基础架构。以下是MySQL的基础架构的主要组件:

连接层:连接层接收客户端请求并将其转发到MySQL服务器上的其他组件进行处理。

查询缓存:查询缓存是一个可选的组件,它可以缓存SELECT语句的结果集以提高性能。

分析器:分析器解析查询语句并创建内部数据结构,MySQL使用这些结构来执行查询。

优化器:优化器根据查询的复杂程度和表的大小等因素确定最佳执行计划。

执行器:执行器执行查询并返回结果集。

存储引擎:存储引擎负责管理数据的存储和检索,MySQL支持多种不同的存储引擎,例如InnoDB和MyISAM。

日志管理器:日志管理器记录所有对MySQL数据库的操作,包括查询、更新和删除等操作,以便在需要时进行回滚或恢复。

备份管理器:备份管理器用于创建和管理数据库备份,以保护数据免遭损坏或丢失。

以上是MySQL的基础架构的主要组件,每个组件都有自己的作用和目的,共同构成了MySQL的强大功能。

六、MyISAM 和 InnoDB 有什么区别?

1.介绍:

(1)MyISAM 是 MySQL 的一种存储引擎,它是默认的存储引擎,适用于很多应用场景,如读密集型应用、数据仓库等,它不支持事务和行级锁定,但支持全文本搜索、压缩表格等特性。MyISAM 对于只读或者很少更新的应用非常有效,因为它支持磁盘数据压缩,并且拥有更快速的查询速度。

(2)InnoDB 是 MySQL 的另一种存储引擎,在 MySQL 5.5 后成为默认的存储引擎。它支持事务、行级锁定等特性,能够提供高并发性、高可靠性、高恢复性的数据库服务。相对于 MyISAM 引擎,InnoDB 在写入操作时更加安全,可以避免数据损坏问题,并且支持外键约束等关系型数据库特性。

2.区别:

(1)事务支持:InnoDB 支持事务处理,而 MyISAM 不支持。这意味着如果您需要支持数据中的事务或满足 ACID 特性,则应该使用 InnoDB 引擎。

(2)表锁定:MyISAM 使用表级锁定,这意味着在执行写操作时将锁定整个表,而 InnoDB 使用行级锁定,因此只会锁定受影响的行。这使得 InnoDB 更适合高并发环境。

(3)外键支持:InnoDB 支持外键约束,而 MyISAM 不支持。使用 InnoDB 可以更轻松地维护表之间的关系和完整性。

(4)性能:针对不同的场景,MyISAM 和 InnoDB 在性能方面可能存在差异,但是一般情况下,InnoDB 的性能相对较好,特别是在大量写操作的情况下。

(5)存储结构:InnoDB 和 MyISAM 在数据存储结构方面也有所不同。InnoDB 使用聚集索引(Clustered Index)来存储数据,这意味着数据实际上是按照主键的顺序存储的,而 MyISAM 则使用非聚集索引(Non-Clustered Index)。

总的来说,如果需要支持事务处理、外键约束或者在高并发环境下使用 MySQL,则应该考虑 InnoDB 引擎;如果只是进行简单的查询操作且不需要事务处理,则可以使用 MyISAM 引擎。

七、自增id作为主键优缺点

1.优点:

(1)简单:使用整数作为主键通常比使用字符串或其他类型的主键更简单。

(2)快速:自增id是连续的数字,可以快速插入和排序,提高数据库性能。

(3)独特性:自增id在表中始终是唯一的,因此不需要担心主键重复的问题。

2.缺点:

(1)不容易记住:使用自增id作为主键的话,很难想起哪个编号对应哪条记录。

(2)耗尽空间:如果您的表非常大并且经常插入新记录,则可能会耗尽可用的自增id。这可能导致需要重新设置自增id等操作来解决问题。

(3)难以处理分布式环境:在分布式系统中,自增id可能会出现冲突,因为多个节点都可以插入新记录并请求自增id。

3.总结:综上所述,在某些情况下,自增id作为主键是一个好的选择。但是,必须考虑数据集的大小、访问模式、分布式环境等因素来确定是否适合使用自增id作为主键。

八、为什么 MySQL 的自增主键不连续

1.数据库中已经存在的行被删除,导致了自增主键不连续。比如一个表中有 10 条数据,其中第 5 行数据被删除了,那么再插入新数据时,该数据的自增主键值就是 11,而不是原来的 6。

2.数据库出现回滚操作,导致自增主键不连续。当执行一条 INSERT 语句时,如果由于某些原因(例如主键冲突)需要进行回滚操作,那么插入失败的那条记录所使用的自增主键就会“浪费”,下一条记录的自增主键值会比上一条记录大 1。

3.多线程并发插入数据,导致自增主键不连续。在高并发环境下,多个线程同时向同一个表中插入数据,如果它们同时拿到了相同的自增主键值,那么只能有一个线程插入成功,其他线程需要重新获取自增主键值,这样就会造成自增主键不连续。

4.在MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化;

九、redo log 是做什么的

       redo log是用于保证事务的持久性和恢复能力的一种机制,它记录了在数据库引擎执行写入操作时所生成的物理日志。当发生故障或崩溃时,数据库引擎可以利用redo log中的信息进行数据恢复,以保证数据的完整性。

       具体来说,当一个事务提交后,MySQL将其所有修改操作相关的Redo Log都先写到Redo Log Buffer中。然后异步地将Redo Log Buffer中的内容刷新到磁盘上的Redo Log文件中。这样即使服务器突然宕机,那么恢复时只需将Redo Log文件中未刷盘的部分读入内存中进行重做,就可以把已经提交的事务的修改都恢复出来。

       总之,redo log是关键的数据恢复组件,它可以在数据库异常关闭或崩溃时提供数据恢复支持,从而保证数据的完整性和一致性。

名词解释:

Redo Log Buffer:

       Redo Log Buffer是MySql数据库中的一种内存结构,它用于记录数据库的变更操作。当用户对数据库进行修改时(例如插入、更新或删除数据等),这些操作将首先写入Redo Log Buffer中。之后,系统会将Redo Log Buffer中的内容异步刷入磁盘上的Redo Log文件中。这个过程称为Redo Log的切换。

       Redo Log Buffer的作用是保证数据在发生故障时的可恢复性。如果在故障发生前,所有的操作都已经被写入Redo Log文件中,那么在恢复过程中就可以使用Redo Log文件来重做先前的操作,从而将数据库恢复到故障前的状态。

       除了保证可恢复性外,Redo Log Buffer还可以提高数据库性能。因为将写操作暂时保存在内存中,可以减少对磁盘的IO操作,从而提高写操作的效率。

十、redo log 的刷盘时机

       MySQL中的Redo Log是一种重要的日志文件,用于记录事务操作所产生的变化。在MySQL执行事务管理时,Redo Log起着非常重要的作用,能够保证数据的持久性和高可用性。当数据库宕机时,可以利用Redo Log来恢复数据。

Redo Log的刷盘时机有以下两个:

(1)在事务提交时,将Redo Log缓存写入到磁盘

       事务提交时,会先将Redo Log缓存写入磁盘内存,再将事务写入磁盘。这样做可以保证即使系统宕机或停电等突发事件,已经提交的事务也不会丢失。

(2)根据系统策略定期将Redo Log缓存写入到磁盘

       为了避免频繁地写入磁盘影响系统性能,MySQL还会根据系统策略定期地将Redo Log缓存写入到磁盘。具体的时间间隔可以通过参数innodb_flush_log_at_trx_commit来设置,其默认值为1,表示每次事务提交都会同步写入Redo Log。如果将该参数设置为0,则表示只有在事务提交时才会将Redo Log缓存写入磁盘;如果将该参数设置为2,则表示只有在Redo Log缓存被填满时才会将其写入磁盘。

       总之,Redo Log的刷盘时机既需要保证数据的安全性,又需要兼顾系统性能。因此,在实际应用中,需要结合具体情况进行设置。


https://www.xamrdz.com/lan/5uc2016229.html

相关文章: