文章目录
1.简单解释数据库三范式?
2.不满足数据库三范式可能会出现什么情况?
3.解释脏读、不可重复读,幻读,更新丢失
4. Mysql提供了哪几种事务隔离级别?
5.MySQL中varchar与char的区别?
6.MySQL中int(11)与int(3)的区别?
7.date,datetime和timestamp数据类型有什么区别?
8.union 与union all的区别
9.各种join的区别?
10.drop,delete与truncate的区别?
11.MySQL有哪几种索引?
12.简要说明InnoDB事务是如何通过日志来实现的?
13.简述Mysql Innodb引擎和MyIASM引擎的区别?什么时候选择MyIASM?
14.sql执行慢的原因有哪些,如何进行sql优化?
15.视图的作用,视图可以更改么?
16. 说一说MySQL中的锁机制
17. 数据库事务四大特性?
18.ACID、BASE和CAP?
19.MySQL如何获取当前日期?
20.Mysql驱动程序是什么?
21.Innodb引擎有什么特性?
22.索引对性能有哪些影响?
23.二进制日志(binlog)的作用?与redo log的区别?
24.InnoDB的行锁/表锁?
25.什么是MVCC ?
26. sql 语句在 MySQL 中的执行流程
1.简单解释数据库三范式?
第一范式就是数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。
第二范式要求实体的属性完全依赖于主关键字(即不存在部分依赖)。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体
第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息(即消除传递依赖)。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
更多知识点,参考:高性能Mysql——范式与反范式。
2.不满足数据库三范式可能会出现什么情况?
数据冗余(想修改一个属性,就要更新多行数据)
插入异常(想要插入数据,结构因为表设计的问题,导致不能成功插入)
删除异常(只想删除其中的某些数据 ,结果把不该删的也删了)
更新异常(想更新一条数据,结果工作量大,还容易出错)
3.解释脏读、不可重复读,幻读,更新丢失
脏读(Dirty read):在一个事务中读取到另一个事务已经修改但没有提交的数据。
例如,事务A对数据进行了修改,但是还没有提交,这时事务B读取这个数据,然后事务A回滚,那么事务B取的数据无效。不符合一致性。
解决办法:把数据库的事务隔离级别调整到READ_COMMITTED
不可重复读(NonRepeatable Read):不能读到相同的数据内容,事务A读取到了事务B已经提交的修改数据(即一个事务范围内两个相同的查询却返回了不同数据)。
例如事务A先读取数据,然后事务B对该同一数据修改并提交,那么事务A再次读取该数据时,由于事务B对该数据的修改,事务A两次读到的的数据可能是不一样的。不符合隔离性。
解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ
幻读(Phantom Read):事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了(针对的insert操作) 。
在事务A查询结束后,事务B往User表中插入了一条id为1的数据。此时,由于事务A查询到id为1的用户不存在,因此插入1条id为1的数据,报错:主键冲突。不符合隔离性。
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ
更新丢失(Update lose):两个事务同时操作相同数据,后提交的事务会覆盖先提交的事务处理结果。
解决办法:乐观锁
4. Mysql提供了哪几种事务隔离级别?
MySQL数据的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
通过SELECT @@transaction_isolation;(mysql 5.7以下是select @@tx_isolation)可以查看事务隔离级别:
隔离界别为可重复读,那么我写一个脏读和可重复读的事务:
# 事务A
begin;
select * from orders where id="190827F4AK12R30H";
commit;
# 事务B
begin;
UPDATE orders SET left_msg="new message" where id="190827F4AK12R30H";
select sleep(10);
commit;
查询结果是:尽管事务B修改了left_msg为new message,但是事务A的查询结果是old message。
# 事务A
begin;
select * from orders where id="