Java PrepareStatement 插入 1000 万条数据,主键查询 vs 普通字段查询性能对比

本文将通过 Java 代码示例,演示使用 PrepareStatement 插入 1000 万条数据后,分别根据主键和普通字段查询一条数据,并比较了两种查询方式的性能差异。

比较查询时间

要比较查询时间,可以使用 System.currentTimeMillis() 方法获取当前时间戳,然后在插入数据之前和查询数据之后分别记录时间戳,最后计算时间差。

具体步骤如下:

  1. 创建数据库连接。
  2. 执行插入操作:
    • 创建 PrepareStatement 对象。
    • 使用循环插入 1000 万条数据,每次插入一条数据。
    • 记录插入完成后的时间戳。
  3. 执行查询操作:
    • 创建 PrepareStatement 对象。
    • 根据主键查询一条数据,记录查询完成后的时间戳。
    • 根据普通字段查询一条数据,记录查询完成后的时间戳。
  4. 计算插入和查询时间差:
    • 计算插入时间差:插入完成时间戳 - 开始插入时间戳。
    • 计算主键查询时间差:主键查询完成时间戳 - 插入完成时间戳。
    • 计算普通字段查询时间差:普通字段查询完成时间戳 - 主键查询完成时间戳。
  5. 关闭数据库连接。

示例代码如下:

import java.sql.*;

public class Main {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        try {
            // 创建数据库连接
            conn = DriverManager.getConnection('jdbc:mysql://localhost:3306/db_name', 'username', 'password');
            
            // 执行插入操作
            long startTime = System.currentTimeMillis();
            pstmt = conn.prepareStatement('INSERT INTO table_name (field1, field2) VALUES (?, ?)');
            for (int i = 0; i < 10000000; i++) {
                pstmt.setString(1, 'value1');
                pstmt.setString(2, 'value2');
                pstmt.executeUpdate();
            }
            long insertEndTime = System.currentTimeMillis();
            
            // 执行查询操作
            pstmt = conn.prepareStatement('SELECT * FROM table_name WHERE id = ?');
            pstmt.setInt(1, 1);
            rs = pstmt.executeQuery();
            long primaryKeyQueryEndTime = System.currentTimeMillis();
            
            pstmt = conn.prepareStatement('SELECT * FROM table_name WHERE field1 = ?');
            pstmt.setString(1, 'value1');
            rs = pstmt.executeQuery();
            long normalFieldQueryEndTime = System.currentTimeMillis();
            
            // 计算时间差
            long insertTime = insertEndTime - startTime;
            long primaryKeyQueryTime = primaryKeyQueryEndTime - insertEndTime;
            long normalFieldQueryTime = normalFieldQueryEndTime - primaryKeyQueryEndTime;
            
            System.out.println('Insert time: ' + insertTime + 'ms');
            System.out.println('Primary key query time: ' + primaryKeyQueryTime + 'ms');
            System.out.println('Normal field query time: ' + normalFieldQueryTime + 'ms');
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

注意替换代码中的数据库连接信息、表名和字段名。运行代码后,可以查看插入时间和查询时间的差异。

注意: 电脑性能不够的同学可以适当少插入一些数据,以免插入的时间太长。

Java PrepareStatement 插入 1000 万条数据,主键查询 vs 普通字段查询性能对比

原文地址: https://www.cveoy.top/t/topic/qnmu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录