1、数据库的三范式? 详解
- 第一范式:强调列的原子性,及数据库的每一列都是不可以分割的原子数据项。
- 第二范式:要求数据库表中的每行必须可以被唯一 区分,存在多主键的情况下,不可以存在某属性值依赖于其中一个数据主键。
- 第三范式:要求一个数据表不包含已在其他表中存在的非主键字段。
反三范式:有时候会为了提高读取性能,通过用空间换时间的方式,适当的保留冗余字段。
2、一个自增表中总共有17条数据,删除最后两条以后,重启mysql数据库,再插入一条数据的时候,该数据的id是?
需要区分数据库引擎:
- MyISAM id是18
- InnoDB,id是15 ,InnoDB 只会把自增主键的最大值记录在内存中,所以重启之后会导致最大ID丢失。
3、如何获取当前数据库的版本?
4、说一下ACID是什么?
指的是事务的特性:
- Atomicity 原子性:指一个事务中所有操作,或者全部完成,或者全部不完成。
- Consistency 一致性:一个事务执行完成,数据库从一个正确的状态转换成另一个正确的状态
- Isolation 隔离性:多事务并发情况下,事务之间不相互影响,存在四种事务隔离级别
- Durability 持久性:事务处理结束后,对数据的修改是永久的
5、char和varchar的区别是什么?
- char(n):固定长度,实际存储字节不足的时候,会存在空字节。char的效率高,但是浪费空间。比较适合存储邮政编码的
- varchar(n):可变长度,所占空间以实际存储字节为准
6、float和double的区别?
- float : 占四个字节,最多可以存储8位十进制数
- double:占八个字节,最多可以存储16位十进制数
mysql通过B+ Tree 进行数据存储的。
8、说一下数据库的事务隔离级别?
- 读取未提交
- 读取已提交
- 可重复读
- 串行化
9、说一下mysql常用的引擎? 详解
10、说一下mysql行锁和表锁?
MyISAM 只支持表锁,InnoDB支持表锁和行锁,默认是行锁。
- 表级锁:开销小,加锁快,不会出现死锁,锁定的粒度大,发生锁冲突的概率高,并发量低。
- 行级锁:开销大,加锁慢,存在死锁的情况,锁定的粒度小,发生锁冲突概率小,并发量高。
11、说一下乐观锁和悲观锁?
- 乐观锁:每次去拿数据的时候,都默认别人不会修改这个数据,所以不会上锁,但是在提交更新的时候,回去判断一下在此期间有没有人去更新这个数据。
- 悲观锁:每次去拿数据的时候,都默认别人会修改这个数据,所以都会上锁,这样就会阻止其他人修改该数据,直至锁被释放。
数据库的乐观锁需要自己实现,在表中添加一个version字段,每次修改成功值加1,每次提交更新的时候会先去对比一下自己拥有的version和数据库的version是否一致。
12、mysql问题排查都有哪些手段?
- 使用show processlist 命令查看当前所有连接信息
- 使用explain命令查询SQL语句执行计划,索引命中情况
- 开启慢查询日志,查看慢查询的sql
13、如何进行mysql的性能优化?
- 优化执行sql
- 表结构设计
- 存储引擎的选择
14、mysql中对于null值的判断。
- = null 任何情况下,对于null 进行<,>,=,!=等判断,返回值都是false
- is null 只可以对于那些,设置了默认值为空的字段进行 为空 判断,Ent_Name 不可以用is null 判断,但是 Bak_1,Bak_2...是可以用 is null 来判断的。