syzn request url:http://13.11.71.77:8001/api/sy-user-service/open/user/get-user-info-by-token, method:GET, jsonEntity: response:{"code":0,"data":{"id":"1838483386816720935","username":"xulin01","realName":"徐琳","email":"","mobile":"13785133068","sex":0,"avatar":"","status":0,"loginIp":"10.42.0.1","loginDate":1745541451000,"createTime":1731393358000,"roles":[{"id":195,"name":"信息发布平台租户角色"}],"dept":{"id":226,"name":"信息发布平台","parentId":0},"posts":null,"socialUsers":[]},"msg":""} sy-js-travel-service- 2025-04-25 14:11:06 [XNIO-1 task-1] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession sy-js-travel-service- 2025-04-25 14:11:06 [XNIO-1 task-1] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@427bdece] was not registered for synchronization because synchronization is not active sy-js-travel-service- 2025-04-25 14:11:06 [XNIO-1 task-1] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [o
时间: 2025-05-22 19:45:32 浏览: 26
### MyBatis SqlSession 的日志分析与 SQL 查询优化
#### 日志分析
为了更好地理解 `SqlSession` 执行的 SQL 语句及其性能表现,可以通过配置日志框架来捕获和解析这些信息。以下是实现方法:
1. **启用日志记录**
使用 Log4j 或 SLF4J 等日志框架,在 `application.properties` 中设置如下参数以开启调试模式:
```properties
logging.level.com.baomidou.mybatisplus=DEBUG
logging.level.sql=DEBUG
```
这些配置会打印出每次执行的 SQL 和其绑定的参数[^1]。
2. **查看日志内容**
在控制台或日志文件中查找类似以下的内容:
```sql
DEBUG c.w.m.d.UserMapper.selectAllUser - ==> Preparing: SELECT * FROM tb_user
DEBUG c.w.m.d.UserMapper.selectAllUser - ==> Parameters:
DEBUG c.w.m.d.UserMapper.selectAllUser - <== Total: 10
```
3. **分析日志中的关键点**
- **SQL 语法**: 检查是否有冗余字段或不必要的复杂逻辑。
- **参数绑定**: 确认传入的参数是否合理。
- **返回数据量**: 如果返回的数据过多,则可能需要调整查询条件或分页策略[^2]。
---
#### SQL 查询优化建议
针对常见的 SQL 性能瓶颈问题,可以从以下几个方面入手进行优化:
1. **索引优化**
对于频繁使用的列(如过滤条件、排序依据),应创建合适的索引来加速查询操作。例如:
```java
@Select("SELECT * FROM tb_user WHERE username = #{name}")
List<User> selectUserByName(@Param("name") String name);
```
上述查询可通过为 `username` 列添加索引来提升效率[^3]。
2. **减少全表扫描**
尽量避免使用无条件的 `SELECT *` 查询,而是仅选取必要的字段。例如:
```sql
SELECT id, username FROM tb_user;
```
3. **分页处理**
当面对大量数据时,推荐采用基于 `PaginationInnerInterceptor` 的分页机制。通过在配置类中注册此拦截器,可以在不修改业务代码的情况下自动完成 LIMIT 子句的拼接[^4]:
```java
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
```
4. **缓存机制**
启用二级缓存能够有效降低数据库访问频率,从而提高整体响应速度。需注意的是,对于动态变化较大的场景不宜过度依赖缓存[^1]。
5. **批量操作**
若涉及大批量插入/更新动作,则考虑利用 MyBatis 提供的相关工具函数或者自定义 XML 映射规则来简化流程并增强吞吐能力。
---
#### 关于 `PaginationInnerInterceptor`
该组件作为 MyBatis-Plus 插件体系的一部分,默认支持多种主流关系型数据库方言转换工作。它主要负责将原始查询请求改写成带有分页限定符的形式,比如 MySQL 下表现为附加了 `LIMIT offset,size` 的新版本语句[^2]。
实际应用过程中需要注意以下几点事项:
- 数据库类型匹配:确保所选驱动程序兼容目标环境;
- 边界校验:防止非法输入引发异常行为;
- 结果集大小限制:设定合理的最大条目数以防内存溢出风险。
```java
Page<User> page = new Page<>(current_page_number, page_size);
IPage<User> userPage = userMapper.selectPage(page, null);
List<User> users = userPage.getRecords();
long total = userPage.getTotal();
```
以上片段展示了如何借助封装好的 API 实现高效便捷的分页检索服务。
---
### 示例代码展示
下面提供一段完整的 Java 配置样例用于演示上述理论知识点的实际落地情况:
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 可扩展其他功能模块...
return interceptor;
}
/**
* 设置全局配置项
*/
@Bean
public GlobalConfig globalConfig() {
GlobalConfig config = new GlobalConfig();
config.setMetaObjectHandler(new MetaObjectHandlerImpl());
return config;
}
}
```
同时附带简单的 Mapper 接口声明形式以便参考学习之用:
```java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM tb_user ORDER BY create_time DESC")
IPage<User> findUsersByPage(Page<?> page);
}
```
---
阅读全文
相关推荐







