主张以最少的人工成本
获得最大的外链发布提权效果!

MySQL面试攻略:春招必备100题精选(核心问题解析25题及答案)

MySQL面试攻略:春招必备100题精选(核心问题解析25题及答案)

「春季招聘系列」MySQL面试关键50题(附解答)
因篇幅所限,本文仅列出MySQL的25题,其他如Redis、SSM框架、算法、计算机网络等技术栈的面试题目也将陆续更新。本人整理的1000多道面试常见题型将在文末免费分享,近期需要面试复习题目的同学可直接翻至文末获取。
若表中采用自增主键,每次新增记录时,记录将按顺序附加到当前索引节点的尾部。当一页写满时,系统会自动创建一个新的页面。若使用非自增主键(如身份证号或学号等),由于每次插入的主键值接近随机,因此新记录需要插入到现有索引页的任意位置,频繁的移动和分页操作导致大量碎片产生,形成不够紧密的索引结构,后续可能需要通过OPTIMIZE TABLE(优化表)操作重建表并优化页面填充。
服务器层按顺序执行SQL的流程为:
简要概括:
可划分为服务层和存储引擎层两个部分,其中:
服务层包括连接器、查询缓存、解析器、优化器、执行器等,涵盖了MySQL的大部分核心服务功能,以及所有内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能也在这一层实现,例如存储过程、触发器、视图等。
存储引擎层负责数据的存储和检索。其架构采用插件式,支持InnoDB、MyISAM、Memory等多种存储引擎。目前最常用的存储引擎是InnoDB,自MySQL 5.5.5版本起成为默认存储引擎。
DROP、DELETE、TRUNCATE均表示删除,但它们之间存在一些差异:
DELETE用于删除表的全部或部分数据行,执行DELETE后,用户需执行提交(commit)或回滚(rollback)以执行删除或撤销删除,并会触发该表上的所有DELETE触发器。
TRUNCATE用于删除表中的所有数据,此操作无法回滚,也不会触发表上的触发器,TRUNCATE比DELETE执行更快,占用空间更小。
DROP命令用于从数据库中删除表,包括所有数据行、索引和权限,所有DML触发器也不会被触发,此命令也无法回滚。
因此,当不再需要某张表时,使用DROP;当想删除部分数据行时,使用DELETE;当保留表但删除所有数据时,使用TRUNCATE。
隔离级别包括脏读、不可重复读、幻读,分别是:READ-UNCOMMITTED(未提交读)、READ-COMMITTED(提交读)、REPEATABLE-READ(重复读)、SERIALIZABLE(可串行化读)
MySQL InnoDB存储引擎默认支持的隔离级别是REPEATABLE-READ(可重读)
需要注意的是:与SQL标准不同,InnoDB存储引擎在REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock锁算法,因此可以避免幻读的产生,这与其他数据库系统(如SQL Server)不同。因此,InnoDB存储引擎默认支持的隔离级别是REPEATABLE-READ(可重读)已经可以完全满足事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离级别。
因为隔离级别越低,事务请求的锁越少,所以大多数数据库系统的隔离级别都是READ-COMMITTED(读取提交内容),但要知道的是,InnoDB存储引擎默认使用REPEATABLE-READ(可重读)并不会带来任何性能损失。
InnoDB存储引擎在分布式事务的情况下通常使用SERIALIZABLE(可串行化)隔离级别。
主要原因:B+树只需遍历叶子节点即可实现整棵树的遍历,且在数据库中基于范围的查询非常频繁,而B树只能中序遍历所有节点,效率较低。
文件和数据库都需要较大的存储空间,也就是说,它们都不可能完全存储在内存中,因此需要存储到磁盘上。而索引的存在是为了数据的快速定位和查找,因此索引的结构组织应尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙地利用了局部性原理和磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需一次I/O即可完全载入,而红黑树这种结构,高度明显更深,并且由于逻辑上相邻的节点(父子)在物理上可能相距甚远,无法利用局部性。
最重要的是,B+树还有一个最大的优点:便于全库扫描。
B树必须按中序遍历的方法按序扫描,而B+树直接从叶子节点开始逐个扫描即可,B+树支持范围查询非常方便,而B树不支持,这是数据库选择B+树的最主要原因。
B+树查找效率更加稳定,B树可能在中间节点找到数据,稳定性不足。
B+tree的磁盘读写成本更低:B+tree的内部节点没有指向关键字具体信息的指针(红色部分),因此其内部节点相对B树更小。如果将所有同一内部节点的关键字存放在同一块盘中,那么盘块能容纳的关键字数量也更多。一次性读入内存中的需要查找的关键字也就越多,相对来说I/O读写次数也就降低了;
B+tree的查询效率更加稳定:由于内部节点并不是最终指向文件内容的节点,而只是叶子节点中关键字的索引,所以,任何关键字的查找都必须走一条从根节点到叶子节点的路径。所有关键字查询的路径长度相同,导致每个数据的查询效率相当;
视图是一种虚拟表,通常是某个表或多个表的行或列的子集,具有与物理表相同的功能。游标是对查询结果集作为一个单元进行处理的有效方式。通常不使用游标,但在需要逐条处理数据时,游标显得尤为重要。
在MySQL中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后才对数据库中的对应行进行写入。当事务已经提交后,就无法再次回滚。

在 MySQL 中,数据回溯是通过撤销日志(undo log)来实现的,所有事务的变更都会首先记录到这个撤销日志中,随后才对数据库中的相应行进行写入。一旦事务完成提交,便无法再进行撤销。

撤销日志的功能:1) 在出现错误或用户执行 ROLLBACK 命令时,提供撤销所需的信息;2) 即使整个系统崩溃、数据库进程直接被终止,当用户重新启动数据库进程时,也能立即通过查询撤销日志将之前未完成的事务进行撤销,这也就要求撤销日志必须先于数据持久化到磁盘上,这是我们优先写入日志后写入数据库的主要原因。
InnoDB
MyISAM
概述
数据库并发可能引发脏读、幻读、丢失变更、不可重复读等四个常见问题,其中:
脏读:在第一个修改事务和读取事务进行时,读取事务读到的数据为100,这是修改之后的数据,但随后该事务满足一致性等特性而进行了撤销操作,那么读取事务得到的结果就是脏数据了。
幻读:通常指 T1 在某个范围内进行修改操作(增加或删除),而 T2 读取该范围导致读到的数据是修改之间的,强调范围。
丢失变更:两个写事务 T1、T2 同时对 A=0 进行递增操作,结果 T2 覆盖 T1,导致最终结果是1而不是2,事务被覆盖。
不可重复读:T2 读取一个数据,然后 T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
第一个事务首先读取 var 变量为 50,接着准备更新为 100 的时,并未提交,第二个事务已经读取 var 为 100,此时第一个事务进行了撤销。最终第二个事务读取的 var 和数据库的 var 不一致。
T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和第一次读取的结果不同。
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。例如:事务1读取某表中的数据 A=50,事务2也读取 A=50,事务1修改 A=A+50,事务2也修改 A=A+50,最终结果 A=100,事务1的修改被丢失。
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
悲观锁,先获取锁,再进行业务操作,通常利用类似 SELECT… FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。当数据库执行 SELECT… FOR UPDATE 时会获取被 select 中的数据行的行锁,select for update 获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
乐观锁,先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过。Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或版本号,来实现乐观锁所需的版本判断。
分库与分表的目的是,减轻数据库的单库单表负担,提升查询性能,缩短查询时间。
通过分表,可以减轻数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量减少了,起到提升查询性能,缩短查询时间的作用,此外,可以很大程度地缓解表锁的问题。分表策略可以归纳为垂直拆分和水平拆分:
水平分表:取模分表就属于随机分表,而时间维度分表则属于连续分表。如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表。将大文本的字段单独拆分到另外一张扩展表,将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。
库内分表,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。
分库与分表带来的分布式难题与应对策略数据迁移与扩容问题——一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。分页与排序问题——需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。
不可重复读的重点是修改,幻读的重点在于新增或删除。
视图是虚拟的表,与包含数据的表不同,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的 SQL 操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有 order by 则对视图再次 order by 将被覆盖。
创建视图:create view xxx as xxxx
对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
B+tree的磁盘读写成本更低,B+tree的查询效率更加稳定数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
B+树的特点
在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。不宜:1)对于查询中很少涉及的列或者重复值比较多的列;2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

在经常使用的、用于精简查询范围的字段,以及需要排序的字段上创建索引。不宜:1)对于查询中很少使用的列或重复值较多的列 2)对于某些特殊的数据类型,不宜创建索引,例如文本字段(text)等。

如果一个索引包含了(或者说涵盖了)所有需要查询的字段的值,我们称其为“完全索引”。
我们了解到在InnoDB存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再次查找,这样就会相对较慢。完全索引就是将查询所需的列和索引相对应,无需进行回表操作!
例如:
学号姓名性别年龄系别专业 20020612李辉男20计算机软件开发 20060613张明男18计算机软件开发 20060614王小玉女19物理力学 20060615李淑华女17生物动物学 20060616赵静男21化学食品化学 20060617赵静女20生物植物学
主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。
26道SQL面试题目,涵盖数据分析面试80%的知识点
以下是26道SQL面试题的简要答案,覆盖了数据分析面试中的关键知识点:
INNER JOIN和OUTER JOIN有何不同?
INNER JOIN返回两个表中匹配的行。OUTER JOIN返回至少一个表中的所有行。
JOIN和UNION有何区别?
JOIN用于连接两个表。UNION用于合并两个表的结果集。
UNION和UNION ALL有何区别?
UNION返回唯一的结果集。UNION ALL返回所有行,包括重复的行。
WHERE子句和HAVING子句有何区别?
WHERE子句用于过滤行。HAVING子句用于过滤分组。
索引对数据库系统的负面影响有哪些?
索引会占用物理空间,增加数据库体积,并可能降低写入操作的速度。
在什么情况下不适合创建索引?
很少查询的列。重复值较多的列。特殊数据类型。
为数据表创建索引的规则有哪些?
在频繁使用的字段上创建索引。根据查询模式创建索引。
索引的底层实现原理和优化?
索引基于B+树实现。优化通常涉及经过优化的B+树结构。
MySQL中索引、唯一索引、主键、联合索引的区别及性能影响?
索引提高查询速度,但可能影响插入、删除、更新速度。唯一索引确保列值唯一。主键是唯一的标识,通常也是索引。联合索引用于多个列的组合查询。
什么是事务?
事务是数据库操作序列,要么全部成功,要么全部失败。
什么是数据库的ACID原则?
ACID原则包括原子性、一致性、隔离性、持久性。
事务隔离级别有哪些?
未授权读取、授权读取、可重复读取、序列化。
SQL中的视图是什么?
视图是存储的查询结果,可以当作表格使用。
视图的优点有哪些?
简化查询、提高安全性、更易维护。
什么是存储过程?如何调用?
存储过程是一组SQL语句,通过命令对象调用。
什么是触发器?
触发器是在插入、更新、删除语句前后自动执行的SQL代码。
什么是事件?
事件是在特定时刻自动执行任务的操作。
怎样创建事件?
使用CREATE EVENT语句创建事件。
如何优化MySQL中的DISTINCT?
将DISTINCT转换为GROUP BY以提高查询效率。
CHAR和VARCHAR有何区别?
CHAR长度固定,VARCHAR长度可变。
三个范式的理解及其优缺点?
第一范式:属性具有原子性。第二范式:记录有唯一标识。第三范式:字段没有冗余。优点:减少数据冗余,提高数据一致性。缺点:可能增加查询复杂度。
MySQL数据库作为发布系统的存储优化策略?
设计良好的数据库结构。选择合适的表字段数据类型和存储引擎。添加索引。使用主从读写分离。分表。添加缓存机制。生成静态页面。
窗口函数是什么?与普通聚合函数有何区别?
窗口函数可以对数据库数据进行实时分析处理。与普通聚合函数不同,窗口函数不会减少行数。
专用窗口函数及其基本用法?
包括RANK、DENSE_RANK、ROW_NUMBER等。用于对查询结果进行排名或编号。
使用窗口函数需要注意什么?
窗口函数的执行顺序在FROM、JOIN、WHERE、GROUP BY、HAVING之后。
维护数据库完整性和一致性,触发器与自写业务逻辑的选择?
首先使用约束。其次是触发器。最后是自写业务逻辑。因为约束和触发器更靠近数据库层,易于管理和维护。

以上所转载内容均来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2020@163.com,本人将予以删除。夫唯发布外链网 » MySQL面试攻略:春招必备100题精选(核心问题解析25题及答案)

分享到: 生成海报