MySQL 中使用索引一定有效吗?如何排查索引效果?回答重点索引不一定有效。
例如查询条件中不包含索引列、低基数列索引效果不佳,或查询条件复杂且不匹配索引的顺序。
对于一些小表,MySQL可能选择全表扫描而非使用索引,因为全表扫描的开销可能更小。
最终是否用上索引是根据 MySQL 成本计算决定的,评估 CPU 和 I/O 成本最终选择用辅助索引还是全表扫描。有时候确实是全表扫描成...
MySQL 是如何实现事务的?回答重点MySQL 主要是通过:锁、Redo Log 、Undo Log、MVCC 来实现事务。
MySQL 利用锁(行锁、间隙锁等等)机制,使用数据并发修改的控制,满足事务的隔离性。
Redo Log(重做日志),它会记录事务对数据库的所有修改,当 MySQL 发生宕机或崩溃时,通过重放 redolog 就可以恢复数据,用来满足事务的持久性。
Undo L...
MySQL 中长事务可能会导致哪些问题?回答重点1)长时间的锁竞争,阻塞资源:
长事务持有锁的时间较长,容易导致其他事务在尝试获取相同锁时发生阻塞,从而增加系统的等待时间和降低并发性能。
业务线程也会因为长时间的数据库请求等待而阻塞,部分业务的阻塞可能还会影响到别的服务,导致产生雪崩,最终使得服务全面崩盘,导致非常严重的线上事故。
2)死锁风险:
长事务更容易产生死锁,因为多个事务可能...
为什么 MySQL 选择使用 B+ 树作为索引结构?回答重点B+ 树在数据库系统中具有以下几个显著优势:
1)高效的查找性能:
B+ 树是一种自平衡树,每个叶子节点到根节点的路径长度相同,B+ 树在插入和删除节点时会进行分裂和合并操作,以保持树的平衡,但它又会有一定的冗余节点,使得删除的时候树结构的变化小,更高效。
查找、插入、删除等操作的时间复杂度为 O(log n),能够保证在大数据量情...
如果 MySQL 中没有 MVCC,会有什么影响?回答重点如果没有 MVCC,系统必须频繁地对读写操作进行加锁来保证数据的正确性,因为增加了锁的获取和释放的开销,会导致整体系统响应速度变慢,这种实现叫 LBCC (Lock-Based Concurrent Control)。
扩展知识LBCC (Lock-Based Concurrent Control)想象一下有一个事务 1 正在执行,此...
MySQL 中的事务隔离级别有哪些?回答重点在 MySQL 中,事务隔离级别主要有以下四种:
1)读未提交(READ UNCOMMITTED):
这是最低的隔离级别,在该级别下,一个事务可以看到另一个事务尚未提交的数据修改。这可能会导致脏读问题,即读取到其他事务未提交的数据。
2)读已提交(READ COMMITTED):
在这个级别下,一个事务只能看到已经提交的其他事务所做的修改。这...
MySQL 中的 MVCC 是什么?回答重点MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种并发控制机制,允许多个事务同时读取和写入数据库,而无需互相等待,从而提高数据库的并发性能。
在 MVCC 中,数据库为每个事务创建一个数据快照。每当数据被修改时,MySQL 不会立即覆盖原有数据,而是生成新版本的记录。每个记录都保留了对应的版本号或时...
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?回答重点MySQL 默认的隔离级别是可重复读( Repeatable Read ),即 RR。
原因是为了兼容早期 binlog 的 statement 格式问题,如果是使用读已提交、读未提交等隔离级别,使用了 statement 格式的 binlog 会导致主从(备)数据库数据不一致问题。
扩展知识进一步分析 binlog stat...
数据库的脏读、不可重复读和幻读分别是什么?回答重点1)脏读(Dirty Read):
一个事务读取到另一个事务未提交的数据。如果该未提交事务最终被回滚,那么第一个事务读取的数据就是不一致的(脏的)。
2)不可重复读(Non-repeatable Read):
在同一事务中,读取同一数据两次,但由于其他事务的提交,读取的结果不同。例如,事务 A 读取了一行数据,事务 B 修改并提交了这行...
MySQL 的乐观锁和悲观锁是什么?回答重点悲观锁(Pessimistic Locking):
假设会发生冲突,因此在操作数据之前就对数据加锁,确保其他事务无法访问该数据。常见于对数据一致性要求较高的场景。
实现方式:使用行级锁或表级锁,例如可以使用 SELECT ... FOR UPDATE 或 LOCK IN SHARE MODE 语句来加锁。
乐观锁(Optimistic Lock...
MySQL 中有哪些锁类型?回答重点在 MySQL 中,主要有以下几种锁类型:
1)行级锁(Row Lock)(重点):
仅对特定的行加锁,允许其他事务并发访问不同的行,适用于高并发场景。
2)表级锁(Table Lock)(重点):
对整个表加锁,其他事务无法对该表进行任何读写操作,适用于需要保证完整性的小型表。
3)意向锁(Intention Lock):
一种表锁,用于表示某...
MySQL 中如果发生死锁应该如何解决?回答重点自动检测与回滚:
MySQL 自带死锁检测机制(innodb_deadlock_detect),当检测到死锁时,数据库会自动回滚其中一个事务,以解除死锁。通常会回滚事务中持有最少资源的那个。
也有锁等待超时的参数(innodb_lock_wait_timeout),当获取锁的等待时间超过阈值时,就释放锁进行回滚。
手动 kill 发生死锁的...
如何使用 MySQL 的 EXPLAIN 语句进行查询分析?回答重点explain 主要用来 SQL 分析,它主要的属性详解如下:
id:查询的执行顺序的标识符,值越大优先级越高。简单查询的 id 通常为 1,复杂查询(如包含子查询或 UNION)的 id 会有多个。
select_type(重要):查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查...
MySQL 中 int(11) 的 11 表示什么?回答重点在 MySQL 中,int(11) 中的 11 表示显示宽度,并不影响存储的大小或数值范围。具体来说:
显示宽度:当使用 ZEROFILL 属性时,int(11) 表示如果数值的位数少于 11 位,则会在前面填充零。例如,数值 42 将显示为 00000000042。不使用 ZEROFILL 时,显示结果是 42(前面有九个空格)...
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?回答重点在 MySQL 中,count(*) 、count(1)和count(字段名) 都是用来统计行数的聚合函数,但它们有些许的区别:
功能上:1)count(*) 会统计表中所有行的数量,包括 null 值(不会忽略任何一行数据)。由于只是计算行数,不需要对具体的列进行处理,因此性能通常较高。
2...
MySQL 中 varchar 和 char 有什么区别?回答重点CHAR 和 VARCHAR 是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变长度。
CHAR(n):固定长度的字符串。CHAR 列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL 也会在字符串的末尾填充空格以达到指定长度(如果 char 类型的字符串后面有空格的话,innodb 会忽...
MySQL 中如何进行 SQL 调优?回答重点平时进行 SQL 调优,主要是通过观察慢 SQL,然后利用 explain 分析查询语句的执行计划,识别性能瓶颈,优化查询语句。
1)合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机 I/O
2)避免 SELECT * ,只查询必要的字段
3)避免在 SQL 中进行函数计算等操作,使得无法命中索引
4)避...
如何在 MySQL 中避免单点故障?回答重点一般会使用主从架构来避免单点故障,主数据库处理写操作,从数据库处理读操作,主数据库故障时可以切换到从数据库。
同时会对数据进行定期备份并存储在不同的物理位置,以便在发生故障时能够快速恢复数据。
并且需要建立监控系统,实时监控数据库的健康状态,并在发生故障时及时告警。
扩展知识MySQL 主从,主备或者主主架构介绍
主备架构主备架构就是主机和备机。备...
MySQL 中的数据排序是怎么实现的?回答重点排序过程中,如果排序字段命中索引,则利用索引排序。
反之,使用文件排序。
文件排序中,如果数据量少则在内存中排序,具体是使用单路排序或者双路排序。
如果数据大则利用磁盘文件进行外部排序,一般使用归并排序。
扩展知识根据 explain 的结果来看,MySQL 可以分为索引排序和 filesort。
索引排序如果查询中的 ORDER BY 子句包含...
如何在 MySQL 中实现读写分离?回答重点做法一:代码封装讲白了就是代码层面抽出一个中间层,由中间层来实现读写分离和数据库连接。
利用个代理类,对外暴露正常的读写接口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源。
优点:简单,并且可以根据业务定制化变化,随心所欲。
缺点:如果数据库宕机了,发生主从切换了之后,就得修改配置重启。如果系统是多语言的话,需要为每个语言都实...
如何处理 MySQL 的主从同步延迟?回答重点
首先需要明确一个点延迟是必然存在的,无论怎么优化都无法避免延迟的存在,只能减少延迟的时间。
常见解决方式有以下几种:
二次查询。如果从库查不到数据,则再去主库查一遍,由 API 封装这个逻辑即可,算是一个兜底策略,比较简单。不过等于读的压力又转移到主库身上了,如果有不法分子故意查询必定查不到的查询,这就对主库产生冲击了。
强制将写之后立马读...
什么是 MySQL 的主从同步机制?它是如何实现的?回答重点MySQL 的主从同步机制是一种数据复制技术,用于将主数据库(Master)上的数据同步到一个或多个从数据库(Slave)中。
主要是通过二进制日志(Binary Log,简称 binlog)实现数据的复制。主数据库在执行写操作时,会将这些操作记录到 binlog 中,然后推送给从数据库,从数据库重放对应的日志即可完成复制。
扩展知...
如果组长要求你主导项目中的分库分表,大致的实施流程是?回答重点1)先分析业务需求:
确定数据量及增长趋势,评估分库分表的必要性。(需要一定的预判但是不要过度设计)
2)设计分库分表方案:
选择适合的分库和分表策略(水平、垂直、哈希、范围等),并规划分库分表的结构。
3)实现数据路由:
根据分库分表策略设计数据路由机制,一般通过应用层代码或数据库中间件来实现,将请求路由到相应的数据库...
什么是分库分表?分库分表有哪些类型(或策略)?回答重点分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。
分库分表的类型(或策略) 包括:
1)水平分表:
将同一张表的数据按行划分,分散到多个表中。例如,可以按用户 ID 的范围将数据分为多个表(如 user_1、user_2)。
2)垂直分表:
将一张表的不同列拆分到多个表中...
从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)回答重点在 MySQL 中,获取数据并不总是直接从磁盘读取。MySQL 使用缓存机制,比如 InnoDB 存储引擎,会将常用的数据和索引缓存在内存中,以提高读取性能。当查询数据时,系统首先会检查缓存(如缓冲池),如果数据存在于内存中,则直接从内存中读取;如果不在,则会从磁盘读取并加载到缓存中。
扩展知识MySQL 中的缓存...
对数据库进行分库分表可能会引发哪些问题?回答重点1)首先是事务的问题。
我们使用关系型数据库,有很大一点在于它保证事务的完整性。
而分库之后单机事务就用不上了,必须使用分布式事务来解决,而分布式事务相对而言就比较重了,而且大部分的分布式事务只能保证最终一致性,所以业务上会存在数据不一致的场景。
2)连表 JOIN 问题
在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法...
MySQL 的 Doublewrite Buffer 是什么?它有什么作用?回答重点MySQL 的 Doublewrite Buffer 是 InnoDB 存储引擎中的一个机制,用于确保数据的安全性和一致性。其作用是将数据首先写入一个内存缓冲区(双写缓冲区),然后再将其写入数据文件。这种方式可以防止在写入过程中因崩溃或故障导致数据损坏,确保数据的一致性和完整性。
工作原理简述:
写入流程:...
MySQL 的 Change Buffer 是什么?它有什么作用?回答重点Change Buffer 是 MySQL InnoDB 存储引擎中的一个机制,用于暂存对二级索引的插入和更新操作的变更,而不立即执行这些操作,随后,当 InnoDB 进行合适的条件时(如页被读取或 Flush 操作),会将这些变更写入到二级索引中。
作用:
提高写入性能:通过将对二级索引的变更暂存,可以减少对磁盘的...
为什么在 MySQL 中不推荐使用多表 JOIN?回答重点性能问题:
多表 JOIN 可能导致查询性能下降,尤其是在处理大数据集时,JOIN 操作的计算复杂度会显著增加,需要进行大量的数据扫描和匹配,增加了内存和CPU的消耗,导致响应时间变长。
可读性和维护性:
多表 JOIN 的查询语句较为复杂,降低了 SQL 的可读性和可维护性。复杂的语句可能会增加错误发生的概率,使得后续的调试和...
MySQL 中的 Log Buffer 是什么?它有什么作用?回答重点MySQL 中的 Log Buffer 是一个内存区域,用于暂时存储事务日志(redo log)的数据。在 InnoDB 存储引擎中,它的主要作用是提高性能,通过批量写入操作将日志数据从内存中写入磁盘,减少磁盘 I/O 操作的频率。
扩展知识进一步理解 Log Buffer我们来看一下官网的一张图:
我们看看...