ORM框架中,MyBatis因灵活SQL而受欢迎。但SQL写不好,性能会急剧下降。本文总结MyBatis和MySQL优化技巧。
一、MyBatis核心
<select id="selectUser" resultType="User"> SELECT id, name, age FROM user WHERE id = #{id} </select>#{}预编译,${}拼接有SQL注入风险。
二、动态SQL
<select id="search"> SELECT * FROM user <where> <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="age != null"> AND age = #{age} </if> </where> </select>三、一级二级缓存
一级缓存:SqlSession级别,默认开启
二级缓存:Mapper级别,需
<cache/>
<cache eviction="LRU" flushInterval="60000" size="512"/>
注意:分布式环境慎用二级缓存。
四、分页优化
使用PageHelper:
PageHelper.startPage(1, 10); List<User> users = userMapper.selectAll(); PageInfo<User> pageInfo = new PageInfo<>(users);
深分页优化:
-- 慢 SELECT * FROM user LIMIT 1000000, 10; -- 快:使用上次最大id SELECT * FROM user WHERE id > 1000000 LIMIT 10;
五、索引优化
最左前缀原则
覆盖索引
避免索引失效:函数、类型转换、前导模糊
使用EXPLAIN分析
EXPLAIN SELECT * FROM user WHERE name = 'Tom';
六、SQL优化技巧
避免
SELECT *小表驱动大表
用JOIN代替子查询
批量插入用
INSERT INTO ... VALUES (...), (...)更新用主键
避免大事务
七、连接池
HikariCP配置:
spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000
八、分库分表
垂直拆分:按业务
水平拆分:按数据
中间件:ShardingSphere、MyCat
spring: shardingsphere: rules: sharding: tables: t_order: actual-data-nodes: db$->{0..1}.t_order$->{0..1} table-strategy: standard: sharding-column: order_id sharding-algorithm-name: inline九、实战案例
某查询从3秒优化到50ms:
原SQL:
SELECT * FROM order WHERE DATE(create_time) = '2024-01-01'问题:函数导致索引失效
优化:
WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02'添加联合索引
(create_time, status)
十、总结
MyBatis优化核心是SQL和索引。掌握EXPLAIN、连接池、分库分表,能应对海量数据场景。