1.数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项
第二范式:要求实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性
第三范式:任何非主属性不依赖于其它非主属性(不存在传递依赖)
2.一张自增表里面共有7条数据,删除了最后两条数据,重启MySQL数据库,又插入了一条数据,此时ID是几?
表类如果是MyISAM,那么id是8
表类型如果是InnoDB,那么id是6
InnoDB表只会把自增主键的最大纪录在内存中,所以重启会导致最大的id丢失
3.说一下ACID是什么
A 原子性“一个事务的所有操作,或者全部完成,或者全部不完成,不会结束在中间某环节,事务在执行过程中发生的错误,会被恢复到事务开始前的状态
C 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。、
I isolation隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据不一致。事务隔离分为不同级别:(1)读未提交(Read uncomitted)、读提交(read committed)、可重复读(repeatable read)、串行化(Serializable)
Durability(持久化):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
4.char和varchar的区别是什么?
char(n):固定长度类型,比如char(10),当你输入”abc“三个字符的是受,它们占用的空间还是10个字节,其它7个字节是空字节。
varchar(n):可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度
5.MySQL的内连接、左连接、右连接
内连接关键字:inner join 左连接 left join 右连接 right join
内连接是把匹配的关联数据显示出来,左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反
6.MySQL索引是怎么实现的?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说MySQL索引,不同的数据引擎实现有所不同,目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以达到二分法的性能
7.说一下数据库的事务隔离:
read-committed(读未提交):最低隔离级别、事务未提交前,就可以被其它事务读取(会出现幻读、脏读、不可重复读)
read-committed:提交读,一个事务提交后才能被其他事务读取到
repeatable-read:可重复读。默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容时一致的
seriaizable:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
8.说一下MySQL的行锁和表锁?
MyISAM只支持表锁,InnoDB支持表锁和行锁,
表级锁:开销小,加锁块。锁粒度大,发生锁冲突的概率最高,并发量低
行级锁:开销大,加锁慢。锁粒度小,发生锁冲突的概率小,并发度最高
9.说一下乐观锁和悲观锁?
乐观锁:每次取拿数据的时候都任务别人不会修改,所以不会上锁,但是提交更新的时候会判断一下再次期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,知道这个锁被释放
10.如何做MYSQL的性能优化?
为搜索子字段创建索引
避免使用select *,列出需要查询的字段
垂直分割表
选择正确的存储引擎