- 1、主键、外键有什么区别?
2、怎么理解三范式和反范式?
3、范式和反范式的优缺点?
4、什么是事务?
5、事务有哪几个特性?
6、什么是脏读、幻读、不可重复读?
7、MySQL 有哪些事务隔离级别?
8、MySQL 默认的事务隔离级别是?
9、什么是索引?
10、索引有什么用?
11、索引为什么能提高查询效率?
12、索引的设计有哪些原则?
13、什么情况下应不建或少建索引?
14、MySQL 索引的种类有哪些?
15、MySQL 索引最左匹配原则怎么理解?
16、MySQL 数据库引擎怎么选择?
17、MySQL 默认数据库引擎是什么?
18、MySQL 引擎 MyISAM 和 InnoDB 的区别?
19、char 和 varchar 的区别?
20、MySQL 的 drop、delete、truncate区别?
21、MySQL 怎么实现分页查询?
22、MySQL 的高可用方案有哪些?
23、如何分析一条 SQL 语句的执行计划和性能?
24、MySQL 查询优化有哪些方法?
25、MySQL 为什么不建议默认 null 值?
26、MySQL 为什么尽量选择最小数据类型?
27、怎么理解数据库中的乐观锁和悲观锁?
28、MySQL 中的 MVCC 是指什么?
29、MySQL InnoDB 的 MVCC 实现机制?
30、MySQL 中的 MVCC 支持哪些事务隔离级别?
31、MySQL 支持哪三种级别的锁?
32、MySQL InnoDB 支持什么锁?
33、MySQL 中的表锁有哪些?
34、MySQL 中的行锁有哪些?
35、MySQL 中的意向锁有什么用?
36、MySQL 中的意向锁的分类?
37、MySQL 中的意向锁是表锁还是行锁?
38、MySQL 中的自增锁有什么用?
39、MySQL 行锁是锁的是什么?
40、MySQL 行锁实现的几种算法?
41、MySQL 什么情况会发生死锁?
42、MySQL 死锁怎么排查?
43、MySQL 如何解决死锁?
44、MySQL 如何避免死锁?
45、MySQL 和 MariaDB 的区别?
46、MySQL 日志 undo 和 redo 的区别?
47、什么是表分区?
48、表分区有什么好处?
49、表分区与分表的区别?
50、MySQL 支持的分区类型有哪些?
51、MySQL 分区表有哪些限制因素?
52、MySQL 为什么要分库分表?
53、MySQL 分库分表怎么做?
54、MySQL 分库分表工具有哪些?
55、MySQL 分库分表会产生哪些问题?
56、MySQL 批量插入,如何不插入重复数据?
1、主键、外键有什么区别?
什么是主键?
主键是一个特殊键,可唯一标识表中的每个记录。 在关系数据库中,在表的每一行中都有唯一的标识符非常重要,而主键正是您唯一地识别表中的元组所需要的。 元组表示关系数据库中的一组值属性。 主键可以引用关系数据库表中的一列或一组列,用于隐式标识表中的所有记录。 对于每个记录,主键必须是唯一的,因为它充当唯一的标识符,并且不应包含Null值。 每个数据库必须只有一个主键。
什么是外键?
外键是指数据库记录中的一个字段或字段的集合,它唯一地标识其他表中另一个数据库记录的关键字字段。简单来说,它在数据库的两个不同表中的记录之间建立链接。它可以是表中指向主键列的列,这意味着表中定义的外键是指其他某个表的主键。在关系数据库中,引用对于建立记录之间的链接至关重要,这对于排序数据库至关重要。外键在关系数据库规范化中起着重要作用,尤其是当表需要访问其他表时。
主键和外键的区别
- 主键与外键的基础
主键是关系数据库中的特殊键,它充当每个记录的唯一标识符,这意味着它唯一地标识表中的每一行/记录,并且其值对于表的每一行都应该是唯一的。另一方面,外键是一个表中的字段,该字段将两个表链接在一起。它指的是唯一标识另一张表或同一张表的一行的一列或一组列。 - 主键与外键的关系
主键唯一地标识关系数据库表中的记录,而外键引用表中的字段,该字段是另一个表的主键。一个主键必须是唯一的,并且在必须定义的表中仅允许一个主键,而在一个表中则允许多个外键。 - 主键与外键的值重复
主键是UNIQUE和Not Null约束的组合,因此在关系数据库表的主键字段中不允许重复的值。不允许两行携带主键属性的重复值。与主键不同,外键可以包含重复值,关系数据库中的表可以包含多个外键。 - 主键与外键的NULL
两者之间的主要区别之一是,与主键不同,外键也可以包含NULL值。关系数据库中的表只能具有一个不允许NULL值的主键。 - 主键与外键临时表
可以在临时表及其变量上隐式定义主键约束,而不能在本地或全局临时表上强制使用外键约束。 - 删除主键与外键
无法从父表中删除主键值,该主键值在子表中被称为外键。您必须先删除子表,然后再删除父表。相反,即使外键值引用到父表的主键,也可以将其从子表中删除。
总结
键在数据库模式的存在中起着至关重要的作用,以建立表之间以及表内的链接。 键建立关系并强制执行不同类型的完整性,尤其是表级和关系级完整性。 首先,他们确保表包含唯一记录,并且用于在表之间建立关系的字段必须包含匹配值。 主键和外键是关系数据库中使用的两种最重要和最常见的键类型。 主键是用于唯一标识表中记录的特殊键,而外键用于建立两个表之间的关系。 两者的结构相同,但在关系数据库架构中扮演不同的角色。
2、怎么理解三范式和反范式?
三范式和反范式第一范式:强调原子性,即列不能再分。 第二范式:强调唯一性,即必须有主键,其他列必须完全依赖于主键,不能部分依赖, 第三范式:任何非主键列只能依赖于主键,不能依赖于其他(others)列。 即满足第一范式前提,当存在多个主键的时候,才会发生不符合第二范式的情况
反三范式, 故名思义,跟范式所要求的正好相反,在反范式的设计模式,我们可以允许适当的数据的冗余,用这个冗余去取操作数据时间的缩短。也就是利用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联;
3、范式和反范式的优缺点?
范式的优点:
1)范式化的数据库更新起来更加快;
2)范式化之后,只有很少的重复数据,只需要修改更少的数据;
3)范式化的表更小,可以在内存中执行;
4)很少的冗余数据,在查询的时候需要更少的distinct或者group by语句。
范式的缺点:
5)范式化的表,在查询的时候经常需要很多的关联,因为单独一个表内不存在冗余和重复数据。这导致,稍微复杂一些的查询语句在查询范式的schema上都可能需要较多次的关联。这会增加让查询的代价,也可能使一些索引策略无效。因为范式化将列存放在不同的表中,而这些列在一个表中本可以属于同一个索引。
反范式的优点:
1)可以避免关联,因为所有的数据几乎都可以在一张表上显示;
2)可以设计有效的索引;
反范式的缺点:
3)表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失。
4、什么是事务?
事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
5、事务有哪几个特性?
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
6、什么是脏读、幻读、不可重复读?
1,脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B) update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。
2,不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
3,虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
7、MySQL 有哪些事务隔离级别?
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。