MySQL面试题
面试题如何设计一个关系型数据库?
首先划分为两大部分,一个存储部分,类似文件系统将数据持久化到硬盘上, 另一个是程序实例部分,创建模块:
存储管理,缓存机制,SQL解析,日志管理,权限划分,容灾机制,索引管理,锁模块。
数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
第二范式:要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式:任何非主属性不依赖于其它非主属性。
事务的基本要素 ACID⭐
Atomicity(原子性):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
Isolation(隔离性):同一时间,只允许一个事务操作同一数据,不同的事务之间彼此没有任何干扰。 事务隔离分为
不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行
化(Serializable)。
Durability(持久性):事务处理结束后,对数据的修改是永久的。
char 和 varchar 的区别是什么?
char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7
个是空字节。
char 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。
varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。
where与having的区别
用的地方不一样
where可以用于select、update、delete和insert into values(select * from table where ..)语句中。
having只能用于select语句中
执行的顺序不一样
where的搜索条件是在执行语句进行分组之前应用
having的搜索条件是在分组条件后执行的
即如果where和having一起用时,where会先执行,having后执行数据库的事务隔离/事务隔离级别⭐
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可
重复读)。
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
REPEATABLE-READ:可重复读,mysql默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一
致,禁止读取到别的事务未提交的数据(会造成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
在MySQL可重复读的隔离级别中并不是完全解决了幻读的问题,而是解决了读数据情况下的幻读问题。而对于修改的
操作依旧存在幻读问题,就是说MVCC对于幻读的解决是不彻底的。 通过next key lock解决了幻读的问题。
Record lock:单个行记录上的锁
Gap lock:间隙锁,锁定一个范围,不包括记录本身#牛客AI配图神器#
Next-key lock:record+gap 锁定一个范围,包含记录本身