Oracle 資料庫中綁定變數是效能調優標準動作,能減少硬解析、提升快取命中、防止 SQL 注入。MySQL 5.1+ 透過 mysqli_stmt_prepare 支援伺服器端準備語句,但社區長期爭論其效能增益是否明顯。本文透過實測量化 PHP+MySQL 環境下綁定變數的實際提升幅度。
| 元件 | 版本/規格 |
|---|---|
| OS | RHEL 5.4 |
| MySQL | 5.1.44-log |
| PHP | 5.2.10 (CLI) with Suhosin-Patch, Zend Optimizer 3.3.3 |
| 測試表 | CREATE TABLE t (name VARCHAR(20), sex TINYINT) ENGINE=InnoDB |
SHOW PROFILES 記錄的 Duration 總和(資料庫端耗時)+ Linux time 指令測量腳本整體執行時間。prepare() → bind_param() → 循環 execute()query()$mysqli = new mysqli("localhost", "root", "123321", "test");
$mysqli->query("SET @@profiling=1");
$stmt = $mysqli->prepare("INSERT INTO t(name, sex) VALUES (?, ?)");
$stmt->bind_param("si", $name, $sex);
$data = [['andy',0],['mandy',1],['michael',0],['happy',1],['PHP',1],
['MySQL',1],['Linux',1],['Oracle',1],['unix',1],['cisco',1]];
foreach ($data as $row) {
$name = $row[0]; $sex = $row[1];
$stmt->execute();
}
$stmt->close();
$result = $mysqli->query("SHOW PROFILES");
// 統計 Duration 總和...
$mysqli = new mysqli("localhost", "root", "123321", "test");
$mysqli->query("SET @@profiling=1");
$sqls = [
"INSERT INTO t(name, sex) VALUES ('andy',0)",
"INSERT INTO t(name, sex) VALUES ('mandy',1)",
// ... 10 條不同 SQL
];
foreach ($sqls as $sql) {
$mysqli->query($sql);
}
$result = $mysqli->query("SHOW PROFILES");
// 統計 Duration 總和...
| 執行次 | 綁定變數 | 非綁定變數 |
|---|---|---|
| 1 | 0.000102 | 0.000103 |
| 2 | 0.000093 | 0.000104 |
| 3 | 0.000102 | 0.000114 |
| 4 | 0.000102 | 0.000103 |
| 5 | 0.000094 | 0.000119 |
| 6 | 0.000130 | 0.000113 |
| 7 | 0.000102 | 0.000114 |
| 8 | 0.000100 | 0.000102 |
| 9 | 0.000138 | 0.000120 |
| 10 | 0.000095 | 0.000120 |
| 平均 | 0.0001058 | 0.000112 |
| 指標 | 綁定變數 | 非綁定變數 |
|---|---|---|
| real 平均 | 0.0395s | 0.0395s |
| user 平均 | 0.0247s | 0.0258s |
| sys 平均 | 0.0129s | 0.0118s |
資料庫端平均耗時降低約 5.5%((0.000112 - 0.0001058) / 0.000112)。
腳本整體執行時間(含 PHP 解析、網路往返)無顯著差異,受限於 time 指令毫秒級精度與系統噪音。
execute() 仍需傳送參數、執行開啟表/鎖定/寫入/日誌/釋放完整流程,僅省略「SQL 解析、優化、執行計畫生成」階段。簡單 INSERT 此階段耗時極短。real_escape_string。prepare/bind/execute。query()。mysqli_insert_id() 時機:準備語句需在 execute() 後立即呼叫,INSERT DELAYED 不支援。MySQL 綁定變數在簡單 INSERT 場景下資料庫端提升約 5-6%,整體腳本耗時無感知差異。但其安全性、規範性、可維護性價值遠超微小效能增益,應作為預設開發規範而非效能優化手段。效能調優應優先關注索引設計、查詢重寫、架構分層、快取策略等高影響力手段。