为什么 MySQL 选择使用 B+ 树作为索引结构?回答重点B+ 树在数据库系统中具有以下几个显著优势:
1)高效的查找性能:
B+ 树是一种自平衡树,每个叶子节点到根节点的路径长度相同,B+ 树在插入和删除节点时会进行分裂和合并操作,以保持树的平衡,但它又会有一定的冗余节点,使得删除的时候树结构的变化小,更高效。
查找、插入、删除等操作的时间复杂度为 O(log n),能够保证在大数据量情...
MySQL 是如何实现事务的?回答重点MySQL 主要是通过:锁、Redo Log 、Undo Log、MVCC 来实现事务。
MySQL 利用锁(行锁、间隙锁等等)机制,使用数据并发修改的控制,满足事务的隔离性。
Redo Log(重做日志),它会记录事务对数据库的所有修改,当 MySQL 发生宕机或崩溃时,通过重放 redolog 就可以恢复数据,用来满足事务的持久性。
Undo L...
MySQL 中的 MVCC 是什么?回答重点MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种并发控制机制,允许多个事务同时读取和写入数据库,而无需互相等待,从而提高数据库的并发性能。
在 MVCC 中,数据库为每个事务创建一个数据快照。每当数据被修改时,MySQL 不会立即覆盖原有数据,而是生成新版本的记录。每个记录都保留了对应的版本号或时...
MySQL 中的事务隔离级别有哪些?回答重点在 MySQL 中,事务隔离级别主要有以下四种:
1)读未提交(READ UNCOMMITTED):
这是最低的隔离级别,在该级别下,一个事务可以看到另一个事务尚未提交的数据修改。这可能会导致脏读问题,即读取到其他事务未提交的数据。
2)读已提交(READ COMMITTED):
在这个级别下,一个事务只能看到已经提交的其他事务所做的修改。这...
MySQL 中有哪些锁类型?回答重点在 MySQL 中,主要有以下几种锁类型:
1)行级锁(Row Lock)(重点):
仅对特定的行加锁,允许其他事务并发访问不同的行,适用于高并发场景。
2)表级锁(Table Lock)(重点):
对整个表加锁,其他事务无法对该表进行任何读写操作,适用于需要保证完整性的小型表。
3)意向锁(Intention Lock):
一种表锁,用于表示某...
MySQL 的乐观锁和悲观锁是什么?回答重点悲观锁(Pessimistic Locking):
假设会发生冲突,因此在操作数据之前就对数据加锁,确保其他事务无法访问该数据。常见于对数据一致性要求较高的场景。
实现方式:使用行级锁或表级锁,例如可以使用 SELECT ... FOR UPDATE 或 LOCK IN SHARE MODE 语句来加锁。
乐观锁(Optimistic Lock...
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?回答重点在 MySQL 中,count(*) 、count(1)和count(字段名) 都是用来统计行数的聚合函数,但它们有些许的区别:
功能上:1)count(*) 会统计表中所有行的数量,包括 null 值(不会忽略任何一行数据)。由于只是计算行数,不需要对具体的列进行处理,因此性能通常较高。
2...
MySQL 中的数据排序是怎么实现的?回答重点排序过程中,如果排序字段命中索引,则利用索引排序。
反之,使用文件排序。
文件排序中,如果数据量少则在内存中排序,具体是使用单路排序或者双路排序。
如果数据大则利用磁盘文件进行外部排序,一般使用归并排序。
扩展知识根据 explain 的结果来看,MySQL 可以分为索引排序和 filesort。
索引排序如果查询中的 ORDER BY 子句包含...
什么是 MySQL 的主从同步机制?它是如何实现的?回答重点MySQL 的主从同步机制是一种数据复制技术,用于将主数据库(Master)上的数据同步到一个或多个从数据库(Slave)中。
主要是通过二进制日志(Binary Log,简称 binlog)实现数据的复制。主数据库在执行写操作时,会将这些操作记录到 binlog 中,然后推送给从数据库,从数据库重放对应的日志即可完成复制。
扩展知...
MySQL 中如何进行 SQL 调优?回答重点平时进行 SQL 调优,主要是通过观察慢 SQL,然后利用 explain 分析查询语句的执行计划,识别性能瓶颈,优化查询语句。
1)合理设计索引,利用联合索引进行覆盖索引的优化,避免回表的发生,减少一次查询和随机 I/O
2)避免 SELECT * ,只查询必要的字段
3)避免在 SQL 中进行函数计算等操作,使得无法命中索引
4)避...
MySQL 的 Change Buffer 是什么?它有什么作用?回答重点Change Buffer 是 MySQL InnoDB 存储引擎中的一个机制,用于暂存对二级索引的插入和更新操作的变更,而不立即执行这些操作,随后,当 InnoDB 进行合适的条件时(如页被读取或 Flush 操作),会将这些变更写入到二级索引中。
作用:
提高写入性能:通过将对二级索引的变更暂存,可以减少对磁盘的...
MySQL 中长事务可能会导致哪些问题?回答重点1)长时间的锁竞争,阻塞资源:
长事务持有锁的时间较长,容易导致其他事务在尝试获取相同锁时发生阻塞,从而增加系统的等待时间和降低并发性能。
业务线程也会因为长时间的数据库请求等待而阻塞,部分业务的阻塞可能还会影响到别的服务,导致产生雪崩,最终使得服务全面崩盘,导致非常严重的线上事故。
2)死锁风险:
长事务更容易产生死锁,因为多个事务可能...
Redis 通常应用于哪些场景?回答重点1)缓存:
Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。
2)实时系统:
Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。
3)消息队列:
利用 Redis 的 List 和 Pub/Sub 功...
Redis 为什么这么快?回答重点主要有 3 个方面的原因,分别是存储方式、优秀的线程模型以及 IO 模型、高效的数据结构。
Redis 将数据存储在内存中,提供快速的读写速度,相比于传统的磁盘数据库,内存访问速度快得多。
Redis 使用单线程事件驱动模型结合 I/O 多路复用,避免了多线程上下文切换和竞争条件,提高了并发处理效率。
Redis 提供多种高效的数据结构(如字符串...
为什么 Redis 设计为单线程?6.0 版本为何引入多线程?回答重点单线程设计原因:
Redis 的操作是基于内存的,其大多数操作的性能瓶颈主要不是 CPU 导致的
使用单线程模型,代码简便的同时也减少了线程上下文切换带来的性能开销
Redis 在单线程的情况下,使用 I/O 多路复用模型就可以提高 Redis 的 I/O 利用率了
6.0 版本引入多线程的原因:
...
Redis 中跳表的实现原理是什么?回答重点跳表主要是通过多层链表来实现,底层链表保存所有元素,而每一层链表都是下一层的子集。
插入时,首先从最高层开始查找插入位置,然后随机决定新节点的层数,最后在相应的层中插入节点并更新指针。
删除时,同样从最高层开始查找要删除的节点,并在各层中更新指针,以保持跳表的结构。
查找时,从最高层开始,逐层向下,直到找到目标元素或确定元素不存在。查找效率高,时...
Redis 的 hash 是什么?回答重点Redis 的 hash 是一种键值对集合,可以将多个字段和值存储在同一个键中,便于管理一些关联数据。特点如下:
适合存储小数据,使用哈希表实现,能够在内存中高效存储和操作。
支持快速的字段操作(如增、删、改、查),非常适合存储对象的属性。
扩展知识hash 常用命令HSET:设置 hash 中指定字段的值。
1HSET user:1001 na...
Redis 和 Memcached 有哪些区别?回答重点从数据结构上:
Redis:支持多种数据结构,如字符串、列表、集合、有序集合和哈希表,适合存储复杂数据类型。
Memcached:仅支持简单的键值对存储,数据结构较为单一。
从持久化上:
Redis:支持持久化功能,可以将数据保存在磁盘上,通过 RDB 和 AOF 两种方式实现数据的持久化。
Memcached:不支持数据持久化,...
Redis 支持事务吗?如何实现?回答重点Redis 支持事务,但它的事务与 MySQL 中的事务有所不同。MySQL 中的事务主要支持 ACID 的特性,而 Redis 中的事务主要保证的是多个命令执行的原子性,即所有的命令在一个原子操作中执行,不会被打断。
还有一个很重要的点,就是 MySQL 中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
扩展知识Redis 的事务Re...
Redis 数据过期后的删除策略是什么?回答重点Redis 数据过期主要有两种删除策略,分别为定期删除、惰性删除两种:
定期删除:Redis 每隔一定时间(默认是 100 毫秒)会随机检查一定数量的键,如果发现过期键,则将其删除。这种方式能够在后台持续清理过期数据,防止内存膨胀。
惰性删除:在每次访问键时,Redis 检查该键是否已过期,如果已过期,则将其删除。这种策略保证了在使用过程中只...
Redis 的 Lua 脚本功能是什么?如何使用?回答重点Redis 的 Lua 脚本功能允许用户在 Redis 服务器端执行自定义的 Lua 脚本,以实现原子操作和复杂逻辑。其核心点包括:
原子性:Lua 脚本的所有命令在执行过程中是原子的,避免了并发修改带来的问题。
减少网络往返次数:通过在服务器端执行脚本,减少了客户端和服务器之间的网络往返次数,提高了性能。
复杂操作:可以在 Lua...
Redis 中有哪些内存淘汰策略?回答重点Redis 的内存淘汰策略一共有 8 种。 8 种里面可以细分为两大类,即开启数据淘汰和不开启数据淘汰两大类,然后开启数据的那一类又可以进行细分,分为基于过期时间的淘汰策略以及全部数据的淘汰策略。
不淘汰数据(默认):
noeviction:当运行内存超过最大设置内存的时候,不会淘汰数据,而是直接返回报错禁止写入
设置了过期时间的数据淘汰:
v...
Redis 中的 Big Key 问题是什么?如何解决?回答重点Redis 中的 “big Key” 是指一个内存空间占用比较大的键(Key),它有什么危害呢?
内存分布不均。在集群模式下,不同 slot 分配到不同实例中,如果大 key 都映射到一个实例,则分布不均,查询效率也会受到影响。
由于 Redis 单线程执行命令,操作大 Key 时耗时较长,从而导致 Redis 出现其它命令阻...
Redis 的 Pipeline 功能是什么?回答重点Redis 的 Pipeline 功能允许客户端在一次网络请求中批量发送多个命令,以减少网络延迟并提高性能。通过将多个命令打包发送,客户端可以在不等待每个命令响应的情况下继续发送其他命令,从而显著提高吞吐量。
好处:
节省了网络传输时间
减少了 Redis 服务端上下文切换带来的开销
扩展知识与事务的区别
Pipeline 并不保证命...
如何解决 Redis 中的热点 key 问题?回答重点Redis 中的热点 Key 问题是指某些 Key 被频繁访问,导致 Redis 的压力过大,进而影响整体性能甚至导致集群节点故障。
解决热点 Key 问题的主要方法包括:
热点 key 拆分:将热点数据分散到多个 Key 中,例如通过引入随机前缀,使不同用户请求分散到多个 Key,多个 key 分布在多实例中,避免集中访问单一 Key...
Redis 的持久化机制有哪些?回答重点Redis 提供两种主要的持久化机制:
RDB(Redis Database)快照:
RDB 是通过生成某一时刻的数据快照来实现持久化的,可以在特定时间间隔内保存数据的快照。
适合灾难恢复和备份,能生成紧凑的二进制文件,但可能会在崩溃时丢失最后一次快照之后的数据。
AOF(Append Only File)日志:
AOF 通过将每个写操作追加到日...
Redis 的哨兵机制是什么?回答重点Redis 的哨兵机制(Sentinel) 是一种高可用性解决方案,用于监控 Redis 主从集群,自动完成主从切换,以实现故障自动恢复和通知。
主要功能包括:
监控:哨兵不断监控 Redis 主节点和从节点的运行状态,定期发送 PING 请求检查节点是否正常。
自动故障转移:当主节点发生故障时,哨兵会选举一个从节点提升为新的主节点,并通知客户端更新主...
Redis 在生成 RDB 文件时如何处理请求?回答重点在 Redis 生成 RDB 文件时是异步的(使用 bgsave 命令),采用了 fork 子进程的方式来进行快照操作。生成 RDB 文件的过程由子进程执行,主进程继续处理客户端请求,所以可以保证 Redis 在生成快照的过程中依然对外提供服务,不会影响正常请求。
扩展知识生成 RDB 文件的时候,数据可以修改吗?当然可以。主进程会正常...
Redis 集群的实现原理是什么?回答重点Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个实例存储部分的数据(即每个实例之间的数据是不重复的)。
具体是采用哈希槽(Hash Slot)机制来分配数据,将整个键空间划分为 16384 个槽(slots)。每个 Redis 实例负责一定范围的哈希槽,数据的 key 经过哈希函数计算后对 16384 取余即可定...
Redis 主从复制的实现原理是什么?回答重点Redis 的主从复制是指一个 Redis 实例(主节点)可以将数据复制到一个或多个从节点(从节点),从节点从主节点获取数据并保持同步。
复制流程:
开始同步:从节点通过向主节点发送 PSYNC 命令发起同步。
全量复制:如果是第一次连接或之前的连接失效,从节点会请求全量复制,主节点将当前数据快照(RDB文件)发送给从节点。
增量复制:全量复制...