關於 MySQL 預處理語句是否能提升性能,社區存在兩種截然不同的觀點。本文通過嚴謹的基準測試,在 MySQL 5.1.57 環境下對比直接查詢與預處理語句的執行效率,得出令人驚訝的結論。
MyTable,含字段 DictIDSET profiling=1 開啟性能分析,從 information_schema.profiling 獲取微秒級耗時open table 干擾profiling_history_size=100 保留足夠樣本NormalQuery.sql(直接查詢)
SET profiling=1;
SELECT * FROM MyTable WHERE DictID = 100601000004; -- 預熱
SELECT DictID FROM MyTable LIMIT 1, 100;
SELECT DictID FROM MyTable LIMIT 2, 100;
...
SELECT DictID FROM MyTable LIMIT 100, 100;
-- 導出結果分析
StmtQuery.sql(預處理語句)
SET profiling=1;
SELECT * FROM MyTable WHERE DictID = 100601000004; -- 預熱
SET @stmt = 'SELECT DictID FROM MyTable LIMIT ?, ?';
PREPARE s1 FROM @stmt;
SET @s = 100;
SET @s1 = 101; ... SET @s100 = 200;
EXECUTE s1 USING @s1, @s;
EXECUTE s1 USING @s2, @s;
...
EXECUTE s1 USING @s100, @s;
-- 導出結果分析
| 執行順序 | NormalQuery 平均耗時 | StmtQuery 平均耗時 | 勝出者 |
|---|---|---|---|
| 先跑 Normal 再跑 Stmt | 較快 | 較慢 | NormalQuery |
| 先跑 Stmt 再跑 Normal | 較快 | 較慢 | NormalQuery |
NormalQuery 同樣完勝,預處理語句無優勢。
通過 profiling 細節對比發現:
executing 階段明顯更慢在 MySQL 5.1 命令行/腳本場景下,預處理語句不僅未提升效率,反而比直接執行 SQL 更慢。
PREPARE/EXECUTE 需要額外網絡往返EXECUTE 仍需優化,未複用執行計劃PreparedStatement 對象,避免重複解析不要盲目相信「預處理提升性能」。在應用層使用參數化查詢主要為安全性;性能優化應優先關注索引設計、SQL 重寫、架構分層等更高收益手段。