数字马力 业务一面
Q: redis比数据库快的原因?
A: Redis 比传统数据库快,主要是由于数据结构、存储方式、读写模式、网络架构等方面的差异
Q: 谈下I/O的多路复用?
A:I/O 多路复用是一种技术,它允许一个进程同时监控多个 I/O 流,以确定其中哪些流已经准备好进行读或写操作,从而提高系统的 I/O 处理效率和性能
Q: 聊聊 缓存雪崩/缓存击穿?
A:缓存雪崩:缓存雪崩是指在缓存系统中,大量缓存数据在同一时间点过期或失效,导致大量原本应该从缓存中获取的数据请求直接落到后端数据库等数据源上,造成数据库负载瞬间过高,甚至可能导致数据库崩溃,进而影响整个系统的正常运行
解决方案
- 分散缓存过期时间
- 使用缓存集群
- 设置多级缓存
- 数据预热
- 缓存降级与熔断
缓存击穿:存击穿是指在缓存系统中,一个存在于缓存中的热点数据,由于其缓存过期或者在某些特殊情况下缓存突然失效,导致大量针对该数据的请求同时直接访问后端数据库,给数据库带来巨大压力的现象
解决方案
- 设置热点数据永不过期
- 加互斥锁
- 使用分布式锁
- 数据预热
- 采用二级缓存
Q: 数据库有那些索引
A:按照应用维度划分:
- 主键索引:加速查询 + 列值唯一(不可以有 NULL)+ 表中只有一个。
- 普通索引:仅加速查询。
- 唯一索引:加速查询 + 列值唯一(可以有 NULL)。
- 覆盖索引:一个索引包含(或者说覆盖)所有需要查询的字段的值。
- 联合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
- 全文索引:对文本的内容进行分词,进行搜索。目前只有
CHAR
、VARCHAR
,TEXT
列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如 ElasticSearch 代替。 - 前缀索引:对文本的前几个字符创建索引,相比普通索引建立的数据更小,因为只取前几个字符。
Q: 唯一索引和主键索引的区别
A:定义与性质
- 主键索引:是一种特殊的唯一索引,用于唯一标识表中的每一行数据。它基于表的主键列创建,要求主键列的值必须唯一且不能为空。
- 唯一索引:确保索引列中的值是唯一的,但允许有空值(除非明确指定不允许为空)。一个表可以有多个唯一索引。
数量限制
- 主键索引:一个表只能有一个主键索引,因为主键是用来唯一确定一条记录的,具有唯一性和确定性。
- 唯一索引:一个表可以创建多个唯一索引,以满足不同列的唯一性约束需求。例如,在一个员工表中,可以为员工编号创建主键索引,同时为员工的身份证号码、邮箱地址等列创建唯一索引。
空值处理
- 主键索引:主键列不允许为空值,这是由主键的性质决定的,因为空值无法唯一标识一条记录。
- 唯一索引:默认情况下,唯一索引允许列中有一个空值。这是因为数据库在判断唯一性时,会将空值视为一个特殊的值,只要其他非空值不重复即可。但如果在创建唯一索引时指定了不允许为空,则该列也不能有
Q: 一条sql的执行流程?
A:
- 客户端发送请求
- 服务器接收与解析
- 查询优化 (执行计划选择)
- 执行
- 返回结果
Q: 读写分离
A:
应用程序层面实现
- 优点:实现方式较为灵活,可以根据具体的业务需求进行定制化开发,无需额外的中间件。
- 缺点:增加了应用程序的复杂度,需要在代码中维护数据库连接池和读写路由逻辑。
- 实现步骤配置数据库连接信息:在应用程序的配置文件中分别配置主库和从库的连接信息,包括数据库地址、端口、用户名、密码等。实现读写路由逻辑:在代码中判断 SQL 语句的类型,如果是写操作,使用主库连接执行;如果是读操作,从从库连接池中选择一个从库连接执行。可以采用简单的轮询算法或者根据从库的负载情况进行选择。处理事务:在事务中,由于需要保证数据的一致性,所有的操作都应该在主库上执行。
使用数据库中间件实现
- 优点:对应用程序透明,应用程序无需关心读写分离的具体实现细节,只需要像使用单个数据库一样使用中间件。同时,中间件通常提供了负载均衡、高可用性等功能。
- 缺点:增加了系统的复杂度和运维成本,需要对中间件进行配置和管理。
- 常见的数据库中间件:
ShardingSphere:一套开源的分布式数据库中间件解决方案,提供了读写分离、数据分片等功能,支持多种数据库(如 MySQL、Oracle 等)。
Q: 用过那些sql函数
A:
数值函数
- ABS():返回一个数的绝对值。
SELECT ABS(-10); -- 结果:10
SELECT ROUND(3.14159, 2); -- 结果:3.14,保留两位小数
字符串函数
- CONCAT():将多个字符串连接成一个字符串。
SELECT CONCAT('Hello', ' ', 'World'); -- 结果:Hello World
SELECT SUBSTRING('HelloWorld', 1, 5); -- 结果:Hello,从第 1 个字符开始截取 5 个字符
UPPER()
函数将字符串转换为大写,LOWER()
函数将字符串转换为小写。SELECT UPPER('hello'); -- 结果:HELLO SELECT LOWER('WORLD'); -- 结果:world
日期和时间函数
- CURDATE () 和 CURTIME ():
CURDATE()
返回当前日期,CURTIME()
返回当前时间。
SELECT CURDATE(); -- 返回当前日期,例如:2025-02-20 SELECT CURTIME(); -- 返回当前时间,例如:12:34:56
- DATE_ADD () 和 DATE_SUB ():用于在日期上进行加减操作。
SELECT DATE_ADD('2025-02-20', INTERVAL 1 DAY); -- 结果:2025-02-21 SELECT DATE_SUB('2025-02-20', INTERVAL 1 MONTH); -- 结果:2025-01-20
- DATEDIFF():计算两个日期之间的天数差。
SELECT DATEDIFF('2025-02-20', '2025-02-10'); -- 结果:10
聚合函数
- SUM():计算一组数值的总和。
SELECT SUM(sales) FROM orders; -- 计算 orders 表中 sales 列的总和
SELECT AVG(price) FROM products; -- 计算 products 表中 price 列的平均值
SELECT COUNT(*) FROM customers; -- 计算 customers 表中的记录总数
MAX()
函数返回一组数值中的最大值,MIN()
函数返回最小值。SELECT MAX(age) FROM employees; -- 计算 employees 表中 age 列的最大值 SELECT MIN(salary) FROM employees; -- 计算 employees 表中 salary 列的最小值
先暂时写到这里 还有一些没回忆起来 ,一般都是结合项目问的。