今天做一个Java的高性能MySQL的例题:
import java.sql.;
import com.zaxxer.hikari.HikariDataSource;
public class OrderQueryService {
private final HikariDataSource dataSource;
// 初始化高性能连接池
public OrderQueryService() {
// HikariCP是性能最优的连接池实现
var config = new com.zaxxer.hikari.HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/shop?useSSL=false&serverTimezone=UTC&useServerPrepStmts=true");
config.setUsername("root");
config.setPassword("pass123");
config.setMaximumPoolSize(8); // 连接数设为CPU核心数2较合理
config.setConnectionTimeout(30000);
this.dataSource = new HikariDataSource(config);
}
/**
* 高性能查询用户订单列表(带分页)
* 场景:电商平台查询用户30天内的有效订单,按创建时间倒序
*/
public void queryUserRecentOrders(Long userId, int pageNum, int pageSize) {
// SQL优化点1:只查询需要的字段,避免SELECT *
// SQL优化点2:WHERE条件使用索引字段(user_id, status, create_time)
// SQL优化点3:分页使用LIMIT,配合索引排序
String sql = "SELECT id, order_no, total_amount, create_time " +
"FROM orders " +
"WHERE user_id = ? " +
" AND status = 1 " + // 1表示有效订单
" AND create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) " +
"ORDER BY create_time DESC " +
"LIMIT ?, ?";
try (// 自动关闭资源,无需手动finally
Connection conn = dataSource.getConnection();
// PreparedStatement优势:预编译+防SQL注入
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 参数设置(索引从1开始)pstmt.setLong(1, userId); // user_id是索引字段pstmt.setInt(2, (pageNum - 1) * pageSize); // 计算偏移量pstmt.setInt(3, pageSize);// 执行查询long start = System.currentTimeMillis();try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {// 处理结果(实际项目中应映射为实体类)System.out.printf("订单号:%s,金额:%.2f%n",rs.getString("order_no"),rs.getBigDecimal("total_amount"));}}System.out.println("查询耗时:" + (System.currentTimeMillis() - start) + "ms");} catch (SQLException e) {e.printStackTrace();}
}
public static void main(String[] args) {// 测试:查询用户ID=100的第1页订单,每页20条new OrderQueryService().queryUserRecentOrders(100L, 1, 20);
}
}
连接池选择:使用 HikariCP 而非 DriverManager,通过池化连接减少 TCP 握手和认证开销,设置合理的连接数(CPU 核心数 * 2)。
SQL 语句优化:
避免SELECT *,只查询必要字段减少数据传输量
WHERE 条件使用联合索引(user_id, status, create_time),遵循最左前缀原则
用LIMIT分页而非加载全部数据,适合大数据量场景
题目中大部分来自AI,鉴于学习难度较大明天应该再次重温此题