MySQL数据库面试知识点第一期

169 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

数据库是软件开发中非常重要的一环,数据是这个时代真正值钱的东西。本期就来讨论关于数据库在面试中会遇到的一些问题,其中包含个人一些理解,由于本人学识有限,难免会有纰漏之处,还望读者能多多包涵。

1. 基本概念

1.1 基本特点

首先我们简单描述一下MySQL的一些特点:

  1. MySQL原本是开源且免费的,被甲骨文收购后,现在分为两个版本:Community和Enterprise。社区版是自由下载且完全免费的,但是官方不提供技术支持。企业版是收费的,而且不能下载,但是该版本拥有完善的技术支持(官方提供电话技术支持)。
  2. MySQL并非完全遵循标准的SQL语言。可以看作是一种优化。
  3. 微软的SQL Server也是非常优秀的数据库,但仅限于在Windows系统上使用,MySQL支持目前主流的操作系统,可以看作是一种跨平台的优势。

1.2 三大范式

三个范式是数据库逃不开的概念。考虑到MySQL是关系型数据库,所以我们只讨论关系型数据库。

  1. 第一范式(1NF)是字段具有原子性(单一属性),不可再分。比如说姓名字段,是无法区分姓和名的,如果你要区分,那就设计成两个字段。所有关系型数据库都满足第一范式。
  2. 第二范式(2NF)是在第一范式基础上(满足第几范式,必须满足之前的范式),数据表中的每一行被唯一地区分,也叫主键。注意,主键并非只有一个字段,可以有多个字段。2NF要求是非主键字段完全依赖主键字段,而不是部分依赖。例如一张表有key1、key2、con1、con2、con3五列,其中key1和key2组成复合主键,必须同时给出key1和key2的值,才能确定某一列的值。要知道con2的值,必须给出key1和key2;con1和con3同理。
  3. 第三范式3NF要求没有传递依赖(或者说非主键仅依赖主键,不依赖其它非主键)。简言之就是非主键字段必须和主键直接关联而非间接关联。例如下表:

image.png 其中学院电话和学院直接关联,学号要确定学院电话,是:学号->学院->学院电话。这就存在传递依赖。

规范化的好处是减少数据冗余和提高更新数据效率。规范化程度越高,划分的表就越多,查询时联表就越多,查询效率就越低。现在很多公司提倡适度冗余,遵循第二范式,否则会因为联表过多导致查询效率骤降。

1.3 数据库事务

数据库事务由4个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

  1. 原子性:一个事务往往由多个操作组成,这些操作要么全部执行,要么全部不执行。不能只执行一部分。
  2. 一致性:事务执行前后状态要保持一致。
  3. 隔离性:多个事务并发执行时互不影响。
  4. 持久性:已经提交的事务会记录在硬盘上,这个修改是长期的。 在4个特性中,AID的目的都是C。一致性是我们的最终目的,前3个只是手段。简言之就是守恒,或者说要符合我们业务逻辑上的预期。你扣除了100元,必然有人增加100元。你签到获得1个硬币,你的硬币总数必然+1,而不是加+2、+0或-1。

一致性最难理解,教科书式的解释过于生硬。一致性是由用户决定的,数据库默认所以事务都具备一致性。

1.4 MySQL存储引擎

数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。这样不同的技术就对应着不同的存储引擎。MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。

MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES语句查看系统所支持的引擎类型。

使用哪一种引擎要根据需要灵活选择,一个数据库中不同的表可以使用不同的引擎以满足各种性能和实际需求。使用合适的存储引擎将会提高整个数据库的性能。

功能MylSAMMEMORYInnoDBArchive
存储限制256TBRAM64TBNone
支持事务NoNoYesNo
支持全文索引YesNoNoNo
支持树索引YesYesYesNo
支持哈希索引NoYesNoNo
支持数据缓存NoN/AYesNo
支持外键NoNoYesNo

ok,本期就到这里,下一期继续讲解数据库方面的知识点,敬请关注。