66个面试问题,带你梳理MySQL知识点!

面试时掌握MySQL知识点是关键。
为了帮助有志者充分理解,下面对MySQL的主要概念进行分析。
了解连接类型对于构建高效查询至关重要。
MySQL关系主要分为内部关系和外部关系,其中常用的外部关系是左关系和右关系。
这三个主要范式是数据库设计的基石。
在互联网设计中,反范式往往是通过数据冗余来提高性能,避免跨表和数据库操作。
`char`和`varchar`在字符串处理中拥有自己的字符。
char更适合固定长度的字符串,而varchar适合长度变化的情况,提供更灵活的数据存储。
blob和text的区别在于数据类型和应用场景。
blob用于存储图像文件等二进制数据,而text适用于大型文本数据。
“DATETIME”和“TIMESTAMP”在功能上相似,但具有不同的用例。
`DATETIME`记录日期和时间,`TIMESTAMP`主要用于跟踪数据转换时间。
在“IN”和“EXISTS”语句之间,“IN”执行哈希连接,而“EXISTS”执行循环查询。
存储货币数据时,首选“DECIMAL”和“NUMERIC”类型。
对于emoji存储,MySQL可以直接使用字符串形式,但必须注意兼容性设计。
为了正确显示表情符号,应使用“utf8mb4”编码来支持其他字符集。
最后,了解三种删除操作(例如“删除”、“修改”、“替换”)及其属性对于数据管理至关重要。
特殊差异需要参考原始数据深入理解。

MySQL常见面试题及答案汇总1000道(春招+秋招+社招)

MySQL面试题及答案总结(2021版):

在MySQL面试中,你可能会遇到一系列关于基础知识和高级技术的问题。
以下是一些常见的面试问题和简要回答,涵盖MySQL、索引、事务、性能调优等。
 :存储过程:是通过调用存储函数或触发器来执行的预编译的SQL代码块。
调用方式通常是通过SQL语句来完成。
优化方法:包括数据结构优化、查询语句优化、索引选择和使用、服务器配置调整等。
完整性约束:包括主键约束、唯一约束、外键约束等,保证数据的正确性。
B树的优点:支持范围查询,提高搜索效率,特别是在存储大量数据时。
展示特点:可以根据查询结果创建虚拟表,简化复杂查询,提高数据安全性。
事务日志:用于记录事务操作,保证数据一致性,支持ACID功能。
索引类型:如主键索引、唯一索引、普通索引等,影响查询性能。
关联查询:用于连接多个表,场景包括合并、分析数据。
可视化好处:简化数据访问、提供逻辑视图并提高数据安全性。
主键缺失:可以通过设置自增策略或者增加存储引擎的存储空间来解决。

继续深入面试题包括:InnoDBB+Tree存储差异、读写分离策略、存储过程的优缺点、相关查询优化方法、索引优化技巧等。
了解锁定原理、隔离级别、MySQL性能分析、数据库复制和分区策略也很重要。

对于基础面试官,可能会问你数据类型选择、SQL语句生命周期、索引显示、数据库范式等。
高级面试会关注更复杂的场景,比如并发控制、大表优化、对索引原理的深入理解等。

掌握这些知识点,无论你是应届毕业生、实习生还是经验丰富的开发人员,你都能够在MySQL面试中脱颖而出。
继续通过更多的问题,更好地理解面试所需的知识点和实践经验。

「春招系列」MySQL面试核心25问(附答案)

由于篇幅限制,本文只写了Redis、SSM框架、算法、计算机网络等其他技术组的25道MySQL题,后续会持续更新。
整理了8个部分1000多篇采访文章。
我会放在文章最后。
它对每个人都是完全免费的。
刚刚面试完需要问题答案的同学可以直接翻到文章最后获取。

服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖了MySQL的大部分核心服务功能,以及所有内置函数(如日期、时间、数学等)和加密功能等),所有跨存储引擎功能都在这一层实现,例如存储过程、触发器、机制等视图等

删除用于删除表中全部或部分数据行。
用户执行删除后,需要提交或回滚才能执行删除或回滚,这将触发对该表的所有删除操作。

截断删除表中的所有数据。
此操作无法回滚,也不会触发该面板上的触发器。
此操作比删除更快,占用的空间更少。

Drop命令从数据库中删除表。
所有数据行、索引和权限也将被删除。
所有DML触发器都将被停用,并且此命令无法回滚。

MySQLInnoDB存储引擎支持的默认隔离级别是REPEATABLE-READ(可重复读取)

这里需要注意的是与标准SQL标准的区别在于InnoDB存储引擎中的可重复读取模式。
READ(可重读)事务隔离级别使用Next-KeyLock锁定算法,因此它可以避免虚拟读,这与其他数据库系统(例如SQLServer)不同。
因此,InnoDB存储引擎默认支持的隔离级别是REPEATABLE-READ(可重复读取),可以充分保证事务的隔离要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离。

因为隔离级别越低,一个事务需要的锁就越少,大多数数据库系统的隔离级别都是READ-COMMITTED,但是这个你需要知道,InnoDB存储引擎使用时不会有性能损失默认情况下可重复读取。

脏读:当第一个修改事务和读事务进行时,读事务读取到的数据为100,这是修改后的数据,但该事务满足一致性等要求特性,如果执行回滚操作时,读取事务的结果将是脏数据。

虚拟读:一般情况下,T1在一定范围内进行修改操作(添加或删除),T2读取该范围,导致读取的数据处于修改之间,强调范围。

取消修改:两个写事务T1和T2一起对A=0进行增量操作一次的结果是T2覆盖了T1,导致最终结果是1而不是2并且交易。
覆盖

不可重复读:T2读取了部分数据,然后T1修改了数据。
如果T2再次读取该数据,则读取结果将与第一次读取结果不同。

通过分表,可以减轻数据库中一张表的负担,并且可以将压力分散到不同的表上,同时由于不同表上的数据量不同。
减少。
可以提高查询性能,缩短查询时间。
此外,它可以显着减少表锁定问题。
分表策略可以概括为垂直分表和水平分表:

水平分表:模数分表属于随机分表,而按照时间维度分表属于连续分表。
如何设计垂直拆分,我的建议:将不常用的字段拆分到另一个扩展表中。
将文本较大的字段分开到另一个扩展表中,并将不经常修改的字段放在同一个表中,经常设置。
更改另一个表中的字段。
对于用户数量较多的情况,您可以考虑采用该模块并拆分表。
数据会比较同质,不会轻易出现热点和并发访问瓶颈。

数据库分表只是解决单表数据过大的问题,并不能将单表数据分散到不同的物理机上,并不能减轻压力。
MySQL服务器仍然存在。
同一台物理机上的资源竞争和瓶颈,包括CPU、内存、磁盘IO、网络带宽等。

数据库分区导致的扩散问题及对策以及出现的数据伸缩和迁移问题——一般的做法是通过程序读取数据,然后按照指定的表分区策略放入各个子表中。
分页和排序问题——数据需要在不同的子表中排序返回,不同子表返回的结果集要进行汇总重新排序最终返回给用户。

例如:

【收藏吃灰系列-mysql】索引面试题总结

第一个范式要求各个列不能进一步拆分。
第二种范式要求非主键列完全依赖于主键,而不是依赖于主键的部分。
第三范式要求非主键列仅依赖于主键而不依赖于其他非主键。
设计数据库结构时,尽量遵循三种范式,但设计是可以实现的。
例如,当通过链接查询或数据库表来避免来自其他表的数据时,数据可能会在表面上溢出。
在MySQL中,最好使用NUMERIC或DECIMAL类型来指定货币,例如DECIMAL(9,2),其中9代表位数,2代表小数点后的位数。
工资列值范围为-9999999.99至9999999.99。
不同之处在于char具有固定长度,而varchar则没有。
定长字符检索效率高。
例如,char(10)占用10个字符,无论实际存储的内容如何。
varchar(50)表示最大长度。
Varchar(50)和(200)占用相同的空间,以便hi字符聚集,但必须设置得尽可能小,以免排序时消耗太多内存。
int(10)中的10是指显示字符的宽度,最大为255。
如果实际长度不够,则补0;例如int(X)写入X条数据,显示为00000000~00000000000。
在MySQL中,时间的存储格式为YYYY-MM-DDHH:MM:SS,占8个字节,不能表示时区。
它以符号的形式存储,占用4个字节,范围是1970-1-1到2038-1-19,可以表示一个时区。
不要使用字符串类型来存储时间和日期数据,因为它们对于排序和过滤没有用处,并且不能使用日期函数。
必填字段定义为notnull,以减少占用字节数。
如果数组中有多个空列,InnoDB数组格式会将数组存储为数组列表中不同的空列,并且仅存储一次。
B-Tree和B+Lamb的区别在于:B+Tree包含叶子节点中的所有关键字,叶子节点不仅有最近节点的关键字和索引,而且不存储真实数据;指针链数据库的目的是减少磁盘I/O并提高查询速度。
B+Tree非叶子节点不存储最终数据,每个节点可以存储更多的索引数据,树高更小,可以将更多的索引数据读入内存,减少磁盘I/O读取次数。
所有链接的叶子节点形成一个有序列表,方便远方查询。
数据库不使用哈希索引的原因:查询范围、类型以及虽然不能执行查询。
每个问题都需要回到桌面。
InnoDB存储数据的主要单位是页,默认大小为16k。
引入页目录和数据聚合,并使用二分查找来提高速度。
MySQL索引分类为聚合索引、二级索引、唯一索引和链接索引。
聚集索引是最有效的,二级索引避免搜索后续的表,而组合索引则遵循最大的源。
聚集索引是指数据和索引存储在同一物理位置,并按主键顺序排列。
联合索引的最后一个元素意味着搜索可以从左列开始。
可以匹配连续索引,遇到可见查询时匹配就会停止。
主键建议使用自增ID,而不是UUID,因为自增ID是在InnoDB存储引擎中,叶子节点连续排列存储索引和所有数据。
如果使用UUID,混乱会导致严重崩溃,甚至分页。
细节没有必要比普通索引更快。
更新数据之前必须验证索引的唯一性,结果可能相差不大。
随着查询,直接返回唯一索引,继续查找普通索引。
效果上并没有太大区别。
设置但未使用的索引可能是因为优化器选择了不同的路径或者查询的条件不使用索引。
当页面很大时,可以使用连续查询或ID范围查询来降低I/O成本,预先检查内容并缓存。
MySQL的左外连接、右外连接和全外连接的区别是:左外连接只包含左表的所有行和右表的相应部分;匹配右表和左表部分;外关节饱满。
连接包含两个表中的所有匹配和不匹配行。
where和上面的区别在于:在永久连接之外,where会过滤所有结果,只进入驱动表中按条件过滤的列,其他列会显示为none。
两者内部没有区别。
组合原理采用嵌套循环算法,驱动表被访问一次,从动表被访问多次。
为了解决表驱动的I/O成本问题,通常将joinbuffer表加载到驱动程序的事件集中,并且在每次连接时驱动程序匹配多个表。
MySQLcountOptimization()性能:count可以统计零行,而countrows(插入)只统计非空行。
创建二级索引以避免扫描全表。