1.数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
第二范式:要求实体的属性完全依赖于主键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式:任何非主属性不依赖于其他非主属性。
2.自增表里总共有7条数据,删除最后2条数据,重启mysql数据库,又插入一条数据,此时id是几?
表的类型是MyISAM,那id就是8。
表的类型是InnoDB,那id就是6。
InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后会导致最大id丢失。
3.如何获取当前数据库版本?
使用select version()获取当前数据版本。
4.说一下ACID是什么?
Atomicity(原子性):一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。即事务不可分割、不可约简。
Consistency(一致性):在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
Isolation(隔离性):数据允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
5.char和varchar的区别是什么?
char是固定长度类型,比如char(10),当输入的是abc三个字符的时候,它们占的空间还是10个字节,其他7个是空字节。
varchar是可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
char优点:效率高。缺点:占用空间。使用空间:存储密码的md5值,固定长度的,使用char非常合适。
所以,从空间上考虑varcahr比较合适。从效率上考虑char比较合适,两者使用需要权衡。
6.float和double的区别是什么?
float最多可以存储8位十进制数,并在内存中占4个字节。
double最多可以存储16为十进制数,并在内存中占8个字节。
7.mysql的内连接、左连接、右连接有什么区别?
内连接关键字:inner join、左连接关键字:left join、右连接关键字:right join
内连接是关联数据全部显示,左连接是以左边的表为参照显示数据,右连接是以右边的表为参照显示数据。
8.mysql索引是怎么实现的?
索引是满足某种特定条件查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
mysql中的索引,不同的数据引擎实现有所不同,但目前主流的数据引擎的索引都是B+树实现的,B+树的搜索效率,可以达到二分法的性能,找到数据区域之后就找到了完整的数据结构了,所以索引的性能也是更好的。
9.怎么验证mysql的索引是否满足需求?
使用explain查看sql是如何执行查询语句的,从而分析你的索引是否满足要求。
explain语法:explain select * from table where 1=1。
10.说一下数据库的事务隔离?
mysql的事务隔离是在mysql.ini配置文件中添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ。
可用的配置值:
- READ-UNCOMMITTED:未提交读,最低隔离级别,事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
- READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
- REPEATABLE-READ:可重复读,默认级别,保证多次读取同一级别时,其值都和事务开始时候的内容是一致的,禁止读取到别的事务未提交的数据(会造成幻读)。
- SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止幻读、脏读、不可重复读。
11.说一下mysql常用引擎?
InnoDB引擎:mysql5.1之后默认引擎,提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计目的就是处理大数据容量的数据库系统。mysql运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但该引擎不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数,所有当查询总记录数时,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
MyIASM引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率降低。不过和InnoDB不同的是,MyIASM引擎是保存了表的行数,于是当查询总记录数时,可以直接读取已经保存的值而不需要进行扫描全表。如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。
12.说一下mysql的行锁和表锁?
MyIASM只支持表锁,InnoDB支持表锁和行锁,默认行锁。
表锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
行锁:开销大,加锁慢,会出现死锁。锁定粒度小,发生锁冲突的概率小,并发度最高。
13.说一下乐观锁和悲观锁?
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就只能等这个锁被释放。
数据库的乐观锁需要自己实现,可以在表里添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,自己拥有的version和数据库现在的version是否一致,不一致则不修改,这样就实现了乐观锁。
14.mysql问题排查都有哪些手段?
使用show processlist命令查看当前所有连接信息。
使用explain命令查询sql语句执行计划。
开启慢查询日志,查看慢查询sql。
15.如何做mysql的性能优化?
为搜索字段创建索引。
避免使用select *,列出需要查询的字段。
垂直分割分表。
选择正确的存储引擎。