为什么不推荐在 MySQL 中直接存储图片、音频、视频等大容量内容?回答重点MySQL 是关系型数据库,它设计的初衷是高效处理结构化和关系型数据,所以存储大容量的内容本身就不是它的职责所在,因此这方面的能力也不够。
应该将大容量文件存储在文件系统或云服务提供的对象存储服务中,仅在数据库中存储文件的路径或 URL 即可。
扩展知识数据库本身性能问题
数据库性能:存储和检索大容量的二进制数据(如...
在 MySQL 中存储金额数据,应该使用什么数据类型?回答重点在数据库中业界常用两种类型来存储金额:bigint 和 decimal。
1)bigint 代码中用 long。
范围:可以存储的整数范围为 -2^63 到 2^63 - 1(在 MySQL 中为 64 位有符号整数)
存储空间:占用 8 字节(64 位)
精度:精确存储整数,但不支持小数部分,存储的金额单位是分
2)deci...
MySQL 中 VARCHAR(100) 和 VARCHAR(10) 的区别是什么?回答重点两者的区别就是能存储的字符串长度上限不同,字符数上限是由定义中的括号内的数字决定的。
VARCHAR(100) 最多可以存储 100 个字符。
VARCHAR(10) 最多可以存储 10 个字符。
两者存储相同字符串时占用的空间是一样的。除了存储字符本身外,还需要额外的 1 或 2 个字节来记录字...
在什么情况下,不推荐为数据库建立索引?回答重点一般有以下几种情况不推荐建立索引:
1)对于数据量很小的表
当表的数据量很小(如几百条记录)时,建立索引并不会显著提高查询性能,反而可能增加管理的复杂性。
2)频繁更新的表
对于频繁进行插入、更新和删除操作的表,索引会导致额外的维护开销,因为每次数据变更时都需要更新索引,这会影响性能。
3)执行大量的 SELECT *
此时二级索引可...
MySQL 中 EXISTS 和 IN 的区别是什么?回答重点基本功能:
EXISTS 用于判断子查询是否返回任何行,通常用于检查某个条件是否满足。
IN 用于检查某个值是否在指定的集合中,可以是一个子查询或静态值列表。
性能差异:
EXISTS 一旦找到匹配行就会立即返回,通常在子查询返回较大数据集时性能更好。
IN 通常会评估整个子查询并构建一个值列表,然后再进行匹配,在处理较大数...
什么是 Write-Ahead Logging (WAL) 技术?它的优点是什么?MySQL 中是否用到了 WAL?回答重点WAL(Write-Ahead Logging)技术是一种数据库事务日志管理技术,它确保在修改真正的数据之前,先将修改记录写入日志。这使得即使系统崩溃,通过日志也能恢复数据。保证了数据的持久性和一致性。
WAL 它的核心思想就是先写日志,再写数据,大致执行流程如下:
1...
你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么?回答重点MySQL 数据库的默认隔离级别是 RR(可重复读),但是很多大公司把隔离级别改成了 RC(读已提交),主要原因是为了提高并发和降低死锁概率。
为了解决幻读的问题 RR 相比 RC 多了间隙锁(gap lock)和临键锁(next-key lock)。而 RC 中修改数据仅用行锁,锁定的范围更小,因此相比而言 RC 的并发...
如何实现数据库的不停服迁移?回答重点迁移想着很简单,不就是把一个库的数据迁移到另一个库吗?
但是实际上有很多细节,在面试中我们可以假装思考下,然后向面试官复述以下几点:
首先关注量级,如果是几十万的数据其实直接用代码迁移,简单核对下就结束了。如果数据量大那么才需要好好设计方案。
不停服数据迁移需要考虑在线数据的插入和修改,保证数据的一致性。
迁移还需要注意回滚,因为一旦发生问题需要及时切换...
MySQL 数据库的性能优化方法有哪些?回答重点对开发而言,一般可以从 SQL 和库表设计两部分优化 MySQL 性能问题。
SQL 优化根据慢 SQL 日志,找出需要优化的一些语句。
常见优化方向:
1)避免 SELECT *,只查询必要的字段
2)避免在 SQL 中进行函数计算等操作,使得无法命中索引
3)避免使用 %LIKE,导致全表扫描
4)注意联合索引需满足最左匹配原则
5)不要对...
什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?回答重点逻辑删除是一种将数据标记为已删除但实际不会从数据库中移除的删除方式。一般是在表中添加一个表示删除状态的字段,如 is_deleted ,默认是 0 表示未删除,1 表示已删除。
物理删除则是直接从数据库中删除记录。
一般业务上都是使用逻辑删除,便于后续的数据分析、追溯等。
扩展知识物理删除的优缺点优点:
节省存储空间:物...
什么是数据库的逻辑外键?数据库的物理外键和逻辑外键各有什么优缺点?回答重点逻辑外键是一种在应用程序层面上管理和维护数据完整性的方法,而不是通过数据库本身的外键约束。主要是利用应用程序代码来保证引用的完整性。
逻辑外键的优缺点优点:
灵活性高:应用程序层面控制,可以更灵活地实现复杂的业务逻辑。
性能优化:避免了数据库层面的约束检查,可以在某些情况下提高性能(详细看扩展知识)。
跨数据库兼容性...
如果 MySQL 中没有 MVCC,会有什么影响?回答重点如果没有 MVCC,系统必须频繁地对读写操作进行加锁来保证数据的正确性,因为增加了锁的获取和释放的开销,会导致整体系统响应速度变慢,这种实现叫 LBCC (Lock-Based Concurrent Control)。
扩展知识LBCC (Lock-Based Concurrent Control)想象一下有一个事务 1 正在执行,此...
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?回答重点MySQL 默认的隔离级别是可重复读( Repeatable Read ),即 RR。
原因是为了兼容早期 binlog 的 statement 格式问题,如果是使用读已提交、读未提交等隔离级别,使用了 statement 格式的 binlog 会导致主从(备)数据库数据不一致问题。
扩展知识进一步分析 binlog stat...
数据库的脏读、不可重复读和幻读分别是什么?回答重点1)脏读(Dirty Read):
一个事务读取到另一个事务未提交的数据。如果该未提交事务最终被回滚,那么第一个事务读取的数据就是不一致的(脏的)。
2)不可重复读(Non-repeatable Read):
在同一事务中,读取同一数据两次,但由于其他事务的提交,读取的结果不同。例如,事务 A 读取了一行数据,事务 B 修改并提交了这行...
MySQL 中如果发生死锁应该如何解决?回答重点自动检测与回滚:
MySQL 自带死锁检测机制(innodb_deadlock_detect),当检测到死锁时,数据库会自动回滚其中一个事务,以解除死锁。通常会回滚事务中持有最少资源的那个。
也有锁等待超时的参数(innodb_lock_wait_timeout),当获取锁的等待时间超过阈值时,就释放锁进行回滚。
手动 kill 发生死锁的...
MySQL 中 int(11) 的 11 表示什么?回答重点在 MySQL 中,int(11) 中的 11 表示显示宽度,并不影响存储的大小或数值范围。具体来说:
显示宽度:当使用 ZEROFILL 属性时,int(11) 表示如果数值的位数少于 11 位,则会在前面填充零。例如,数值 42 将显示为 00000000042。不使用 ZEROFILL 时,显示结果是 42(前面有九个空格)...
如何在 MySQL 中避免单点故障?回答重点一般会使用主从架构来避免单点故障,主数据库处理写操作,从数据库处理读操作,主数据库故障时可以切换到从数据库。
同时会对数据进行定期备份并存储在不同的物理位置,以便在发生故障时能够快速恢复数据。
并且需要建立监控系统,实时监控数据库的健康状态,并在发生故障时及时告警。
扩展知识MySQL 主从,主备或者主主架构介绍
主备架构主备架构就是主机和备机。备...
MySQL 中 varchar 和 char 有什么区别?回答重点CHAR 和 VARCHAR 是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变长度。
CHAR(n):固定长度的字符串。CHAR 列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL 也会在字符串的末尾填充空格以达到指定长度(如果 char 类型的字符串后面有空格的话,innodb 会忽...
如何在 MySQL 中实现读写分离?回答重点做法一:代码封装讲白了就是代码层面抽出一个中间层,由中间层来实现读写分离和数据库连接。
利用个代理类,对外暴露正常的读写接口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源。
优点:简单,并且可以根据业务定制化变化,随心所欲。
缺点:如果数据库宕机了,发生主从切换了之后,就得修改配置重启。如果系统是多语言的话,需要为每个语言都实...
如何处理 MySQL 的主从同步延迟?回答重点
首先需要明确一个点延迟是必然存在的,无论怎么优化都无法避免延迟的存在,只能减少延迟的时间。
常见解决方式有以下几种:
二次查询。如果从库查不到数据,则再去主库查一遍,由 API 封装这个逻辑即可,算是一个兜底策略,比较简单。不过等于读的压力又转移到主库身上了,如果有不法分子故意查询必定查不到的查询,这就对主库产生冲击了。
强制将写之后立马读...
什么是分库分表?分库分表有哪些类型(或策略)?回答重点分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。
分库分表的类型(或策略) 包括:
1)水平分表:
将同一张表的数据按行划分,分散到多个表中。例如,可以按用户 ID 的范围将数据分为多个表(如 user_1、user_2)。
2)垂直分表:
将一张表的不同列拆分到多个表中...
如果组长要求你主导项目中的分库分表,大致的实施流程是?回答重点1)先分析业务需求:
确定数据量及增长趋势,评估分库分表的必要性。(需要一定的预判但是不要过度设计)
2)设计分库分表方案:
选择适合的分库和分表策略(水平、垂直、哈希、范围等),并规划分库分表的结构。
3)实现数据路由:
根据分库分表策略设计数据路由机制,一般通过应用层代码或数据库中间件来实现,将请求路由到相应的数据库...
对数据库进行分库分表可能会引发哪些问题?回答重点1)首先是事务的问题。
我们使用关系型数据库,有很大一点在于它保证事务的完整性。
而分库之后单机事务就用不上了,必须使用分布式事务来解决,而分布式事务相对而言就比较重了,而且大部分的分布式事务只能保证最终一致性,所以业务上会存在数据不一致的场景。
2)连表 JOIN 问题
在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法...
从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)回答重点在 MySQL 中,获取数据并不总是直接从磁盘读取。MySQL 使用缓存机制,比如 InnoDB 存储引擎,会将常用的数据和索引缓存在内存中,以提高读取性能。当查询数据时,系统首先会检查缓存(如缓冲池),如果数据存在于内存中,则直接从内存中读取;如果不在,则会从磁盘读取并加载到缓存中。
扩展知识MySQL 中的缓存...
MySQL 的 Doublewrite Buffer 是什么?它有什么作用?回答重点MySQL 的 Doublewrite Buffer 是 InnoDB 存储引擎中的一个机制,用于确保数据的安全性和一致性。其作用是将数据首先写入一个内存缓冲区(双写缓冲区),然后再将其写入数据文件。这种方式可以防止在写入过程中因崩溃或故障导致数据损坏,确保数据的一致性和完整性。
工作原理简述:
写入流程:...
MySQL 中的 Log Buffer 是什么?它有什么作用?回答重点MySQL 中的 Log Buffer 是一个内存区域,用于暂时存储事务日志(redo log)的数据。在 InnoDB 存储引擎中,它的主要作用是提高性能,通过批量写入操作将日志数据从内存中写入磁盘,减少磁盘 I/O 操作的频率。
扩展知识进一步理解 Log Buffer我们来看一下官网的一张图:
我们看看...
为什么在 MySQL 中不推荐使用多表 JOIN?回答重点性能问题:
多表 JOIN 可能导致查询性能下降,尤其是在处理大数据集时,JOIN 操作的计算复杂度会显著增加,需要进行大量的数据扫描和匹配,增加了内存和CPU的消耗,导致响应时间变长。
可读性和维护性:
多表 JOIN 的查询语句较为复杂,降低了 SQL 的可读性和可维护性。复杂的语句可能会增加错误发生的概率,使得后续的调试和...
MySQL 中如何解决深度分页的问题?回答重点优化方式可以有三种:
1)子查询
比如 select * from mianshiya where name = ’yupi‘ limit 99999990,10; 这样的一条查询语句,可以优化成:
12345select * from mianshiya where name = 'yupi' and id >= (s...
如何在 MySQL 中监控和优化慢 SQL?回答重点可以利用 MySQL 自带的 slow_query_log 来监控慢 SQL,它是 MySQL 提供的一个日志功能,用于记录执行时间超过特定阈值的 SQL 语句。
对于慢查询,再使用 EXPLAIN 分析执行计划,查看查询的执行顺序、使用的索引、扫描的行数等,以识别潜在的性能瓶颈。
基于 EXPLAIN 再进行针对性的优化,常见的优化方向有...
MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?回答重点
Delete 用于删除行数据,但保留表结构和相关的对象。
Drop 用于完全删除数据库表,包括数据和结构。
Truncate 只删除数据,不会删除表结构和索引等其他结构。
从性能来看,Drop > Truncate > Delete
扩展知识Delete本质上这个删除其实就是给数据行打个标记...