目录
[编辑编辑什么聚簇索引,什么是二级索引(非聚集索引)? 编辑编辑编辑](#编辑编辑什么聚簇索引,什么是二级索引(非聚集索引)? 编辑编辑编辑)
[1. 代理(Proxy)](#1. 代理(Proxy))
[2. 动态代理(Dynamic Proxy)](#2. 动态代理(Dynamic Proxy))
[1. 基于接口的动态代理(JDK 动态代理)](#1. 基于接口的动态代理(JDK 动态代理))
[2. 基于类的动态代理(CGLIB 动态代理)](#2. 基于类的动态代理(CGLIB 动态代理))
1.Redis
缓存穿透:

误判:


缓存击穿:




缓存雪崩:


双写一致性问题:
一致性要求高的业务:

出现脏数据:

如何保证强一致性:


允许短暂的不一致
Redis数据的持久化问题:


rdb的执行原理:

Redis的数据过期策略:

Redis的数据淘汰策略:




MySQL

1.如何去定位慢查询?
SQL语句执行很慢,如何分析?



索引的概念以及索引底层的数据结构

B树
B+树

什么聚簇索引,什么是二级索引(非聚集索引)? 


覆盖索引和超大分页



索引创建的原则有哪些?


什么是联合索引?
联合索引(Composite Index)是数据库中的一种索引类型,它基于表中的多个列创建。与单列索引(基于单个列创建的索引)不同,联合索引可以同时对多个列进行索引,从而提高多列查询的性能。
联合索引的结构
联合索引的结构类似于单列索引,但它将多个列的值组合在一起形成一个索引键。数据库会按照这些列的顺序对数据进行排序和索引。例如,假设有一个表 orders
,包含以下列:
-
order_id
-
customer_id
-
order_date
如果创建了一个联合索引 (customer_id, order_date)
,那么数据库会按照 customer_id
和 order_date
的组合对数据进行排序和索引。
创建联合索引
在 SQL 中,可以通过以下语法创建联合索引:
sql复制
CREATE INDEX idx_customer_order_date
ON orders (customer_id, order_date);
这个索引会按照 customer_id
和 order_date
的组合对数据进行排序和索引。
联合索引的使用场景
-
多列查询:
-
当查询条件涉及多个列时,联合索引可以显著提高查询性能。例如:
sql复制
SELECT * FROM orders WHERE customer_id = 1 AND order_date > '2024-01-01';
在这种情况下,联合索引
(customer_id, order_date)
可以高效地过滤数据。
-
-
排序和分组:
-
联合索引还可以用于优化排序和分组操作。例如:
sql复制
SELECT customer_id, order_date, SUM(amount) FROM orders GROUP BY customer_id, order_date;
如果存在联合索引
(customer_id, order_date)
,数据库可以利用索引快速完成分组操作。
-
-
范围查询:
-
联合索引对于范围查询也非常有效。例如:
sql复制
SELECT * FROM orders WHERE customer_id = 1 AND order_date BETWEEN '2024-01-01' AND '2024-01-31';
在这种情况下,联合索引
(customer_id, order_date)
可以快速定位到满足条件的数据范围。
-
联合索引的注意事项
-
列的顺序:
-
联合索引中列的顺序非常重要。数据库会按照索引中列的顺序进行排序和查找。例如,对于联合索引
(customer_id, order_date)
:-
查询条件
WHERE customer_id = 1 AND order_date > '2024-01-01'
可以高效使用索引。 -
查询条件
WHERE order_date > '2024-01-01'
无法高效使用索引,因为order_date
不是索引的第一列。
-
-
-
索引覆盖:
- 如果查询的所有列都在联合索引中,数据库可以直接从索引中获取数据,而无需访问表本身。这种情况下,查询性能会非常高。
-
维护成本:
- 联合索引会增加插入、更新和删除操作的开销,因为数据库需要维护索引。因此,需要在查询性能和维护成本之间进行权衡。
-
冗余索引:
- 如果已经存在联合索引
(customer_id, order_date)
,那么单列索引(customer_id)
是多余的,因为联合索引已经覆盖了单列索引的功能。
- 如果已经存在联合索引
示例
假设有一个 orders
表,包含以下列:
-
order_id
(主键) -
customer_id
-
order_date
-
amount
创建联合索引:
sql复制
CREATE INDEX idx_customer_order_date
ON orders (customer_id, order_date);
查询示例:
sql复制
-- 查询特定客户的订单,按日期过滤
SELECT * FROM orders
WHERE customer_id = 1 AND order_date > '2024-01-01';
-- 查询特定客户的订单,按日期分组统计金额
SELECT customer_id, order_date, SUM(amount)
FROM orders
GROUP BY customer_id, order_date;
总结
联合索引是数据库中一种强大的工具,可以显著提高多列查询的性能。通过合理设计联合索引,可以优化查询性能,但需要注意索引的维护成本和列的顺序。
什么情况下索引会失效?


谈一谈你对SQL优化的经验
Spring
Spring框架下的单例Bean是线程安全的吗?

什么是AOP,你在项目中是否使用过AOP?

记录日志:
把这些通用代码抽出来,避免跟你的业务代码进行耦合:

定义一个切面类,切面类里面会完成日志的书写:
Spring中事务是如何实现的?
注意如果要开启事务,我们需要在这个方法上添加@Transactional注解。


Spring中事务失效的场景有哪些?
事务失效会导致from账户的钱减少但是to账户的钱并不会增加



Spring中什么是动态代理?什么是代理
在 Spring 框架中,代理(Proxy) 和 动态代理(Dynamic Proxy) 是核心概念,特别是在实现 AOP(面向切面编程)时。它们允许在不修改原始对象代码的情况下,为对象添加额外的行为。下面分别解释这两个概念:
1. 代理(Proxy)
代理 是一种设计模式,它允许创建一个代理对象,该对象可以控制对实际对象的访问。代理对象可以添加额外的逻辑,例如权限检查、缓存、日志记录等,而无需修改原始对象的代码。
在 Spring 中,代理通常用于实现 AOP,通过代理对象来拦截方法调用,并在方法调用前后插入额外的逻辑。
2. 动态代理(Dynamic Proxy)
动态代理 是一种特殊的代理机制,它允许在运行时动态地创建代理对象,而不是在编译时创建。动态代理对象的创建是基于一组接口或父类,代理对象会实现这些接口或继承父类,并在方法调用时插入额外的逻辑。
Spring 使用动态代理来实现 AOP,主要有两种方式:
-
基于接口的动态代理(JDK 动态代理)
-
基于类的动态代理(CGLIB 动态代理)
1. 基于接口的动态代理(JDK 动态代理)
JDK 动态代理是 Java 提供的一种内置机制,用于在运行时动态创建代理对象。它要求目标对象实现一个或多个接口。代理对象会实现这些接口,并在方法调用时通过 InvocationHandler
插入额外的逻辑。
2. 基于类的动态代理(CGLIB 动态代理)
CGLIB 是一个第三方库,用于在运行时动态创建代理对象。与 JDK 动态代理不同,CGLIB 不要求目标对象实现接口,而是通过继承目标类来创建代理对象。代理对象会覆盖目标类的方法,并在方法调用时插入额外的逻辑。
Spring 中的动态代理
Spring 使用动态代理来实现 AOP,具体选择哪种代理方式取决于目标对象的类型:
如果目标对象实现了接口,Spring 会优先使用 JDK 动态代理。
如果目标对象没有实现接口,Spring 会使用 CGLIB 动态代理。
总结
-
代理 是一种设计模式,允许创建一个代理对象来控制对实际对象的访问。
-
动态代理 是一种在运行时动态创建代理对象的机制,Spring 使用动态代理来实现 AOP。
-
Spring 支持两种动态代理方式:
-
JDK 动态代理:基于接口,适用于目标对象实现接口的情况。
-
CGLIB 动态代理:基于类,适用于目标对象没有实现接口的情况。
-
事务管理在 Spring 中就是通过动态代理来实现的。
通过动态代理,Spring 可以在不修改原始代码的情况下,为对象添加额外的行为,从而实现 AOP 的功能。