Oracle 中 PreparedStatement(綁定變量)可大幅減少 Library Cache 硬解析,提升高併發性能。MySQL InnoDB 架構差異大,是否同樣受益?
test1(id INT PRIMARY KEY, ...),5000 行數據Statement(硬解析)與 PreparedStatement 執行 5000 次 SELECT * FROM test1 WHERE id=?,循環 10 次取平均// Statement 硬解析 String sql = "SELECT * FROM test1 WHERE id=" + i; rs = stmt.executeQuery(sql); // PreparedStatement String sql = "SELECT * FROM test1 WHERE id=?"; pstm = conn.prepareStatement(sql); pstm.setInt(1, i); rs = pstm.executeQuery();
| 方式 | 平均耗時(ms) | 備註 |
|---|---|---|
| Statement | 15170 | 每次發送完整 SQL 文本 |
| PreparedStatement (client-side) | 14270 | 驅動端佔位符替換,Server 仍見完整 SQL |
| PreparedStatement + useServerPrepStmts=true | 14300 | 真正 Server-side prepare,Com_stmt_prepare 計數增加 |
useServerPrepStmts=true 啟用後,Server 解析、優化、生成执行计划流程不變,反而增加準備階段開銷。