面试 - DB

原创
2020/02/24 16:49
阅读数 182

LeftJoin、RightJoin用法与作用?
LeftJoin(左连接)返回包括左表中的所有记录和右表中联结字段相等的记录。
RightJoin(右连接)返回包括右表中的所有记录和左表中联结字段相等的记录。
InnerJoin(等值连接)只返回两个表中联结字段相等的行。

MySQL执行计划是什么?
explain

什么情况会导致索引失效?
条件中有or。
对于多列索引,不是使用的第一部分,则不会使用索引。
like查询是以%开头。
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。

MySQL数据库引擎MYISAM和INNODB区别?
InnoDB:
具有事务(commit)、回滚(rollback)。
支持外键。
InnoDB中不保存表的具体行数,获取行数全表扫描。
支持行锁。
适用于需要事务支持的场景。
MyISAM:
不具有事务(commit)、回滚(rollback)。
不支持外键。
直接获取行数。
不支持行锁,插入和更新锁全表读多写少,并且不需要事务支持的场景。

ACID的概念
原子性(atomicity),就是说这个事务要么不执行,要么全部执行,就是上面2条语句,不允许只执行一条而不执行第二天语句的情况发生。
一致性(consistency),就是说数据库从一个一致性状态转移到另一个一致性状态,怎么理解呢,原子性是表示不允许只执行一条而不执行第二条的情况发生,那么一致性就是说要么第一条第二条都执行成功(所谓执行成功就是对数据库持久化数据产生了影响),要么就第一条第二条都执行失败(都不对数据库持久化数据产生影响),不允许一条成功,一条失败的情况。
隔离性(isolation)理解隔离性,就是隔离另一个线程(事务)的操作,比如线程A正在执行这个事务cars_Beijing–,cars_Shanghai++,线程B则正在查询cars_Beijing和cars_Shanghai的值,隔离性就要保证线程B只能查询到事务完全没有执行或者完全成功执行的值,不允许线程B查询到只执行了cars_Beijing–而没有执行cars_Shanghai++的值。
持久性(durability),这个比较好理解,就是事务一旦提交,所修改的数据就被持久化,即使掉电也不会丢失。

事务的隔离级别
未提交读(readuncommitted),就是不做隔离控制,可以读到“脏数据”,比如上面的cars_Beijing–,cars_Shanghai++,这个隔离级别允许其他线程读取到只做了cars_Beijing–而没有做cars_Shanghai++时候的值。显然这个隔离级别没有太大意义,现实中没有人会用,除非这个应用只有读取,没有任何写入。
提交读(readcommitted),提交读就是不允许读取事务没有提交的数据,简单的说,就是上面的cars_Beijing–,cars_Shanghai++,不允许读取到只做了cars_Beijing–,而没有做cars_Shanghai++的记录。这个隔离级别是大多数数据库(除了mysql)的默认隔离级别。
可重复读(repeatableread),什么是不可重复读,就是事务A去做cars_Beijing–,cars_Shanghai++之前,事务B启动了,先读取了一次事务A要修改的值,这个时候事务A修改了记录,但是事务B在事务A修改完后又读取了同一记录值,显然,这导致事务B相同的读取操作却读取了不同值,这就是不可重复读。可重复读就是禁止这种情况发生,比如对需要修改的数据加排他锁,事务B需要读取这个记录,那么整个事务B没有完成之前,都允许事务A启动。可重复读的隔离级别是mysql默认的隔离级别。
可串行化(serialzable),就是多个线程(事务)完全不并发,串行执行,当然不会有任何隔离问题,显而易见效率也最低,一般不采用。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部