1.什么事内连接,外连接,交叉连接,笛卡尔积?
-
内连接(inner join):取得两张表中满足存在链接匹配关系的记录。
-
外连接(outer join):不止取得两张表中满足存在链接匹配关系的记录,还包括某张表中不满足匹配关系的记录
-
交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在SQL中的实现,如果A表有m行,B表有n行,那么A和B交叉连接的结果就有m*n行
-
笛卡尔积:是数学中的一个概念,例如集合A={a.b},集合B={1,2,3},那么A*B={<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}
2.MySQL中的内连接,外连接,左连接,右连接有什么区别?
-
inner join内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
-
left join在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
-
right join在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
3.MySQL中三范式?
-
第一范式:数据表中的每一列都不可在拆分,
-
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
-
第三范式:在第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键。
-
在设计数据结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由,比如性能,事实上我们经常会为了性能而妥协数据库的设计。
4.MySQL中的日志
1.错误日志(error log):错误日志文件对MySQL的启动,运行,关闭过程进行了记录,能帮助定位MySQL问题
2.慢查询日志(slow query log):慢查询日志是用来记录执行时间超过long_query_time这个变量定义的时长的查询语句。通过慢查询日志,可以查找出那些查询语句执行效率很低,以便进行优化。
3.一般查询日志(general log):一般查询日志记录了所有对MySQL数据库请求的信息,无论请求是否正确执行。
4.二进制日志(bin log):关于二进制日志,他记录了数据库所有执行的DDL的DML语句(除了数据查询语句select,show等),以事件形式记录并保存在二进制文件中。
还有两个InnoDB存储引擎特有的日志文件:
1,重做日志(redo log):重做日志至关重要,因为他们记录了对于InnoDB存储引擎的事务日志。
2,回滚日志(undo log):回滚日志同样也是InnoDB引擎提供的日志,顾名思义,回滚日志的作用就是对数据进行回滚。当事务对数据库进行修改,InnDB引擎不仅会记录redo log,还会生成对应的undo log日志,如果事务执行失败或者调用了rollback,导致事务需要回滚,就可以利用undo log中的信息将数据回滚到修改之前的样子。
5.二进制日志(bin log)和重做日志(redo log)有什么区别
-
bin log会记录所有与数据有关的日志记录,包括InnoDB,MyISAM等储存引擎的日志,而redo log只记InnoDB储存引擎的日志。
-
记录的内容不同,bin log 记录的是关于一个事务的具体操作内容,既该日志是逻辑日志。而redo log 记录的是关于每个页(Page)的更改的物理情况。
-
写入的时间不同,bin log 尽在事务提交前进行提交,也就是只写磁盘一次。而在事务进行的过程中,缺不断有redo ertry 被写入redo log 中
-
写入的方式也不同,redo log 是循环写入和擦除就,bin log 是追加写入吗,不会覆盖已经写的文件。
6.MVCC
MVCC多版本并发控制,通常来说就是MVCC通过保存数据的历史版本,根据版本号来处理是否显示,从而达到读取数据的时候不需要加锁就可以保证事务的隔离性效果,MySQL中的InnoDB就是使用这种方式来提高读写事务控制,大大提高了读写事务的并发性能,原因是MVCC时一种不采用锁来控制事务的方式,是一种非阻塞,同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但并不解决更新丢失问题。
7.乐观锁和悲观锁
1.悲观锁:在线程访问时对数据加锁,其他线程暂时无法访问,保证只有一个线程访问和修改数据,只有当线程访问结束并释放锁资源时,其他线程才能访问,
特点:每次只有一个线程可以访问,保证了数据的独占性和正确性,但是每次都需要加锁和释放锁,消耗性能,性能低
2.乐观锁:在访问数据时不会对数据进行加锁,允许多个线程访问,只有进行修改时才会校验数据的准确性,当大量请求访问时,由于不会加锁和解锁,所以性能高,但在高并发情况下,大量的请求会导致数据冲突而浪费资源。