一、面试题总结3
1、mysql中char和varchar的区别?
特性 | char | varchar |
---|---|---|
存储方式 | 定长,长度不足时填充空格 | 可变长,按实际长度存储 |
存储效率 | 固定空间,浪费内存 | 根据实际长度动态分配 |
性能 | 较高,适合固定长度数据 | 稍低,适合不定长度数据 |
适用场景 | 固定长度的字符串 | 不定长度的字符串 |
空格处理 | 自动去除尾部空格 | 保留所有空格 |
最大长度 | 255 字符 | 65,535 字节 |
2、优化sql的手段?(很多方式,八股文各有不同)
(1)使用索引
创建索引:为经常用于查询、排序、分组的列创建索引,以加快检索速度。常见的索引类型有 B-tree 索引、哈希索引等。
索引优化:选择合适的索引类型,并避免在频繁更新的列上创建索引,因为更新索引会增加额外开销。
(2) 优化查询语句
选择性列:只选择实际需要的列,避免使用 SELECT *,减少数据传输和处理开销
避免不必要的计算:在查询中避免对列进行计算操作,例如不要在 WHERE 子句中对列进行函数计算。
(3)优化表结构
数据类型选择:选择合适的数据类型,避免使用过大的数据类型,减少存储和处理开销。例如,使用 INT 替代 BIGINT,使用 VARCHAR(50) 替代 TEXT。
规范化和反规范化:根据需求对表进行规范化(减少数据冗余)和反规范化(提高查询性能),找到平衡点。
(4)4. 使用适当的 SQL 语句
JOIN 类型:使用合适的 JOIN 类型(INNER JOIN、LEFT JOIN、RIGHT JOIN)来提高性能,避免不必要的全表扫描。
子查询和联接:尽量避免使用复杂的子查询,优先考虑使用 JOIN 操作,有时可以提升性能
(5)避免不必要的操作
避免全表扫描:通过优化 WHERE 子句、使用索引等手段避免全表扫描,减少数据的读取量。
避免重复计算:避免在查询中进行重复的计算操作,可以将结果缓存到临时表中,减少重复计算开销。
(6)使用查询优化工具
EXPLAIN:使用 EXPLAIN 命令分析查询执行计划,查看查询的执行过程,并找出可能的瓶颈。
查询优化器:利用数据库提供的查询优化器建议,调整查询语句以获得更好的性能。
3、索引的优缺点
优点
(1)加快数据检索速度:
索引能够显著提高数据检索速度。通过索引,数据库可以快速定位到数据行,而不需要进行全表扫描,从而减少了查询的响应时间。
(2)提高查询效率:
索引使得特定的查询操作,如 SELECT、JOIN、WHERE 子句中的条件查找等,效率更高。特别是对大表或复杂查询的性能影响更为显著。
(3)支持排序和分组:
索引可以加速排序操作(ORDER BY)和分组操作(GROUP BY),因为排序和分组的过程可以利用索引中的有序数据进行优化。
(4)加快连接操作:
在 JOIN 操作中,如果参与连接的列上有索引,可以显著提高连接查询的速度,因为索引加速了行的匹配过程。
(5)优化聚合函数:
对于 COUNT()、SUM() 等聚合函数,索引可以加速这些操作,特别是当聚合函数涉及到的列上有索引时。
缺点
(1)增加存储开销:
索引需要占用额外的存储空间。每个索引都会占用一定的磁盘空间,特别是对大表或多个索引的情况下,存储开销会显著增加。
(2)降低数据写入性能:
每当对表进行数据插入、更新或删除操作时,相关的索引也需要更新。这会增加写操作的开销,可能会导致数据写入性能下降。
(3)维护复杂性:
随着表的增长和索引的增加,索引的维护和管理变得更加复杂。索引的选择和设计需要根据具体的查询需求进行优化。
(4)影响查询计划:
不正确的索引选择或过多的索引可能会导致数据库优化器选择不佳的查询计划,从而影响查询性能。因此,需要合理设计和选择索引。
(5)可能导致性能下降:
在某些情况下,如果索引设计不合理或者过度使用索引,可能会导致性能下降。例如,对于频繁的全表扫描操作,索引可能没有实质性的性能提升效果。
4、怎么分析mysql语句
(1)使用 EXPLAIN:查看查询的执行计划,了解如何访问数据。
输出字段解释
id:查询的标识符,表示查询的顺序。
select_type:查询类型(如 SIMPLE、PRIMARY、UNION)。
table:正在访问的表名。
type:连接类型(如 ALL、index、range、ref、eq_ref),表示访问表的方式。
possible_keys:可能用于查询的索引。
key:实际使用的索引。
key_len:使用的索引的长度。
ref:显示哪个列或常量与索引匹配。
rows:扫描的行数。
Extra:额外信息(如 Using where、Using index、Using filesort)。
(2)使用 SHOW PROFILE:分析查询的执行时间和性能。
SHOW PROFILE 命令可以帮助你查看查询的执行时间和各种操作的时间分布。
启用查询分析
SET profiling = 1;
执行查询
SELECT * FROM employees WHERE department_id = 5;
查看查询分析结果
SHOW PROFILES;
SHOW PROFILE FOR QUERY query_id;
其中,query_id 是 SHOW PROFILES 输出中对应的查询 ID。
(3)使用 ANALYZE TABLE 和 OPTIMIZE TABLE:更新统计信息和优化表结构。
ANALYZE TABLE 命令可以更新表的统计信息,帮助优化查询计划。
OPTIMIZE TABLE 命令可以优化表的存储,提高性能,并重新组织表的存储结构。
(4)监控状态和配置:使用 SHOW STATUS 和 SHOW VARIABLES 查看数据库运行状态。
SHOW STATUS 显示服务器的状态信息,帮助你了解数据库的运行情况。
SHOW VARIABLES 显示 MySQL 配置变量,可以帮助你了解当前的配置。
(5)慢查询日志:找出慢查询,针对性地进行优化。
5、sql问题主要考察的就是分组,分组后排序,以及连接查询
6、Spring中写一个接口,这个接口有两个实现类,在controller层中注入时,怎么区分注入的是第一个service还是第二个?
(1)使用@Autowired注解实现时需要和@Qualifier结合使用,通过使用@Qualifier注解指定要使用哪个实现类。
(2)使用@Resource 注解,并通过 name 属性指定具体的实现类名称。
(3)使用 @Primary 注解,@Primary 表示当有多个候选者时,优先选择这个实现类
7、简单说下对spring的理解?
(1). 依赖注入(DI)和控制反转(IoC)
依赖注入(DI):Spring 的核心特性之一,它通过将对象的依赖关系交给容器管理,从而实现松耦合。开发者只需声明依赖,Spring 容器会负责将所需的依赖注入到对象中。
控制反转(IoC):IoC 容器负责创建、配置和管理对象的生命周期和依赖关系。开发者不再直接控制对象的创建和管理,而是将这些职责交给 Spring 容器。
(2). 面向切面编程(AOP)
Spring 提供了对面向切面编程的支持,使得开发者可以将横切关注点(如日志、安全性、事务管理等)从业务逻辑中分离出来。这样可以提高代码的模块化和可维护性。
(3). 事务管理
Spring 提供了统一的事务管理接口,可以支持编程式和声明式事务管理。无论使用哪种持久化技术(如 JDBC、JPA、Hibernate),Spring 都可以提供一致的事务处理方式。
(4). MVC 框架
Spring MVC 是 Spring 的一个模块,提供了用于构建 Web 应用程序的模型-视图-控制器(MVC)架构。它允许开发者通过控制器处理用户请求,模型负责业务逻辑,视图负责呈现结果。
(5). 数据访问
Spring 提供了对各种数据访问技术的支持,包括 JDBC、ORM(如 Hibernate、JPA)等。它简化了数据访问操作,提供了事务管理、异常处理等功能,减少了样板代码。
(6). 模块化
Spring 框架是模块化的,包含多个子模块,允许开发者根据需要选择合适的模块进行集成。常见的子模块包括:
Spring Core Container:提供 IoC 和 DI 功能。
Spring AOP:支持面向切面编程。
Spring Data Access/Integration:简化数据访问。
Spring Web:支持 Web 应用开发。
Spring Security:提供安全性功能。
Spring Test:支持测试功能。
(7). 灵活性和扩展性
Spring 设计非常灵活,可以与各种技术栈集成,例如:
Web 框架:如 Spring Boot、Spring WebFlux。
持久化框架:如 Hibernate、MyBatis、JPA。
消息中间件:如 RabbitMQ、Kafka。
总结
依赖注入和控制反转:简化对象的创建和依赖管理,支持松耦合设计。
面向切面编程:将横切关注点与业务逻辑分离,提高代码的模块化。
事务管理:提供统一的事务处理机制。
MVC 框架:支持构建 Web 应用程序。
数据访问:简化数据库操作和异常处理。
模块化:提供灵活的模块选择和集成能力。
灵活性和扩展性:支持与多种技术栈的集成。