每日速记10道MySQL面试题17

其他资料

每日速记10道java面试题01-CSDN博客

每日速记10道java面试题02-CSDN博客

每日速记10道java面试题03-CSDN博客

每日速记10道java面试题04-CSDN博客

每日速记10道java面试题05-CSDN博客

每日速记10道java面试题06-CSDN博客

每日速记10道java面试题07-CSDN博客

每日速记10道java面试题08-CSDN博客

每日速记10道java面试题09-CSDN博客

每日速记10道java面试题10-CSDN博客

https://blog.csdn.net/csdn3043663729/article/details/144186734?fromshare=blogdetail&sharetype=blogdetail&sharerId=144186734&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

https://blog.csdn.net/csdn3043663729/article/details/144190379?fromshare=blogdetail&sharetype=blogdetail&sharerId=144190379&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

https://blog.csdn.net/csdn3043663729/article/details/144196618?fromshare=blogdetail&sharetype=blogdetail&sharerId=144196618&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

https://blog.csdn.net/csdn3043663729/article/details/144198387?fromshare=blogdetail&sharetype=blogdetail&sharerId=144198387&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

https://blog.csdn.net/csdn3043663729/article/details/144212339?fromshare=blogdetail&sharetype=blogdetail&sharerId=144212339&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

https://blog.csdn.net/csdn3043663729/article/details/144215028?fromshare=blogdetail&sharetype=blogdetail&sharerId=144215028&sharerefer=PC&sharesource=csdn3043663729&sharefrom=from_link

目录

1.数据库的三大范式是什么?

2.MySQL 中 TEXT 类型最大可以存储多长的文本?

3.什么是数据库中的视图?

4.MySQL中 VARCHAR(100)和 VARCHAR(10)的区别是什么?

5.MySQL中的EXISTS和IN的区别是什么?

6.什么是 Write-Ahead Logging (WAL)技术?它的优点是什么?MySQL 中是否用到了WAL?

7.MySQL的数据库的性能优化有哪些办法?

8.什么是数据库的逻辑外键?数据库的物理外键和逻辑外键各有什么优缺点?

9.什么是MySQL数据库中的binlog?和redo log有什么区别?

10.MySQL事务的二阶段提交是什么?


1.数据库的三大范式是什么?

1、数据库的每个字段都是不可再分的属性,不能出现数组集合等数据,保证每个字段的原子性
2、每个字段都是依赖于整个主键而不是主键的一部分,消除部分依赖。
3、每个字段都是直接依赖于主键,而不是间接依赖,消除依赖传递。

2.MySQL 中 TEXT 类型最大可以存储多长的文本?

1)TINYTEXT:最大长度为 255 字节
2)TEXT:最大长度为 65,535 字节(约 64 KB)
3)MEDIUMTEXT:最大长度为16,777,215字节(约16 MB)
4)LONGTEXT:最大长度为 4,294,967,295 字节(约4 GB)

3.什么是数据库中的视图?

数据库视图是一个虚拟表,它基于一个或多个表的数据,但本身不存储数据。视图简化了数据查询和操作,同时可以提高数据安全性。它只是一种逻辑上的表示,不占用物理空间。
其实就是将表中的列抽象出来形成视图。可以理解成存储起来的sql语句,其它地方可以直接用。
不暴露底层的表结构,有权限控制,所以可以保护一些敏感的、不想让别人看见的列。
视图可以被重复利用,减少代码冗余。

4.MySQL中 VARCHAR(100)和 VARCHAR(10)的区别是什么?

两者的区别就是能存储的字符串长度上限不同,字符数上限是由定义中的括号内的数字决定的。

  • VARCHAR(100)最多可以存储 100 个字符
  • VARCHAR(10)最多可以存储10 个字符

两者存储相同字符串时占用的空间是一样的。除了存储字符本身外,还需要额外的1或 2 个字节来记录字符串的长度。对于长度小于 255 的字符串,使用1个字节;对于长度 255 及以上的字符串,使用 2个字节。
虽然存储的空间一样,但是在查询时,即带上 SORT、ORDER 这些字段时,VARCHAR(100)字段会使得查询所占用的内存空间更多,因为在排序相关内存分配时,它是按照固定大小的内存块进行保存,VARCHAR(100)的内存块会大于 VARCHAR(10)。

5.MySQL中的EXISTS和IN的区别是什么?

exist:用于判断子查询是否有返回,一旦查询到匹配的数据立马返回,适合子表数据量比父表大的场景
in:用于判断某个值是否在某个集合中,会对子查询进行全表扫描,适用于子表数据量小或简单的静态值集合

6.什么是 Write-Ahead Logging (WAL)技术?它的优点是什么?MySQL 中是否用到了WAL?

WAL (Write-Ahead Logging)技术是一种数据库事务日志管理技术,它确保在修改真正的数据之前,先将修改记录写入日志。这使得即使系统崩溃,通过日志也能恢复数据。保证了数据的持久性和一致性。WAL 它的核心思想就是先写日志,再写数据,大致执行流程如下:
1)当一个事务开始时,所有对数据库的修改都会先记录到一个日志文件中,而不是直接应用到数据库文件,这些日志记录了数据的变更信息,可以用于恢复数据。
2)当日志记录被安全地写入磁盘后,才会将这些修改应用到数据库文件中。

7.MySQL的数据库的性能优化有哪些办法?

主要分SQL优化和库表优化两个方面。

SQL 优化(用上索引+减少回表)
根据慢 SQL 日志,找出需要优化的一些语句。
常见优化方向:
1)避免 SELECT*,只查询必要的字段
2)避免在 SQL 中进行函数计算等操作,使得无法命中索引
3)避免使用 %LIKE,导致全表扫描
4)注意联合索引需满足最左匹配原则
5)不要对无索引字段进行排序操作
6)连表查询需要注意不同字段的字符集是否一致,否则也会导致全表扫描

库表设计优化
1)合理的表结构:比如选择合适的数据类型,例如能用 int 的不要用 bigint,还有 varchar 和 char 的选择等等。
2)合理冗余字段:在适当的情况下进行反规范化设计,冗余部分数据,减少关联查询。
3)索引优化:根据查询频率和条件,创建合适的索引,删除不必要的索引,因为索引的维护也是需要成本的。建议使用 EXPLAIN 分析查询执行计划,确认是否用上索引,是否用对索引。
4)分库分表:对于超大规模的数据库系统,可以采用分库分表策略,将数据拆分到多个数据库或表中,提高读写性能和扩展性。

8.什么是数据库的逻辑外键?数据库的物理外键和逻辑外键各有什么优缺点?

逻辑外键不是外键,是一个字段,但是这个字段可以在应用层使用代码来维护表之间的关系。
逻辑外键需要自己手动维护,增加代码量,但是比较灵活,物理外键是由mysql自己维护,方便维护,但是是一种强阻塞,性能差
在并发场景下可能出发级联更新引发数据更新的问题。

延伸→为什么不推荐使用数据库中的外键?

不得使用外键与级联,一切外键概念必须在应用层解决。说明:学生表中的student id 是主键,那么成绩表中的 student id 则为外键。如果更新学生表中的student id,同时触发成绩表中的 student id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式高并发集群:级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

9.什么是MySQL数据库中的binlog?和redo log有什么区别?

MySQL中的binlog(二进制日志)和redo log(重做日志)是两种不同的日志,它们在数据库中扮演着不同的角色,以下是它们的主要区别:

  1. 存储引擎层面

    • redo log 是InnoDB存储引擎特有的日志,只记录数据页的物理修改。
    • binlog 是MySQL服务器层面的日志,记录所有数据库表的修改,包括增删改操作(DML)和表结构的修改(DDL)。
  2. 记录内容

    • redo log 是物理日志,记录数据页的物理修改,关注的是对页的修改。
    • binlog 是逻辑日志,记录的是语句的原始逻辑,类似于“给ID=2这一行的c字段加1”。
  3. 记录时机

    • redo log 在事务提交时记录。
    • binlog 在语句执行时记录。
  4. 使用场景

    • redo log 主要用于恢复数据库,确保事务的原子性和一致性。
    • binlog 用于数据复制、数据恢复、增量备份等高级功能。

10.MySQL事务的二阶段提交是什么?

二阶段提交是mysql为了保证redo log和binlog一致性使用的一种机制。可以在崩溃恢复时保证数据的一致性。

分为两个阶段:准备阶段 +提交阶段
1.准备阶段:InnoDB引擎会先写redo log,并且将其标记为prepare阶段,表示事务已经准备提交但是还没有完成;
2.提交阶段:当redo log变成prepare阶段之后,mysql server层会写binlog,binlog写完之后,会通知InnoDB引擎,将redo log标记成commit状态。表示事务完成。

redo log:记录修改了某个数据页的哪些位置。用于崩溃恢复。
binlog:记录的是sql语句的原始逻辑,例如如“给id=1这一行的age字段加1”,就类似一条sql语句,主要用于主从复制。

为什么需要二阶段提交:
如果没有二阶段提交,可能会出现redo log 和binlog两个日志的不一致,只有出现不一致,在后续的数据恢复中都会导致数据不一致。

阶段提交是如何保证崩溃恢复时的数据一致性:通过对比XID,
1.redo log处于prepare阶段,binlog还没写入,mysql挂了事务还没有提交,binlog里面还没有,所以只要redolog的不做数,数据就是一致的。
2.redo log处于prepare阶段,binlog写入了,mysql挂了对比redo log和binlog是否一致,一致的话,则提交事务,不一致就回滚,也能保证数据一致。

如何对比redolog和binlog:XID(事务ID)
扫描redo log,如果发现有prepare状态的redolog,则拿XID去binlog里面找,如果找到了具有相同XID的事务记录,说明数据已经保存好了,当前这个事务可以直接提交,否则回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值