首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP MySQL Prepared Statement vs 普通查詢:百萬級數據效能實測分析

     編輯:MySQL 資料庫相關知識

測試背景與目的

Prepared Statement(預處理語句)常被宣稱能提升查詢效能並防止 SQL 注入。本文透過實際程式碼測試,對比 mysqli::query() 與 mysqli::prepare() 在不同數據量下的執行時間差異。

測試程式碼實作

<?php
class Timer {
    private $startTime = 0;
    private $stopTime = 0;
    private $timeSpent = 0;

    public function start() {
        $this->startTime = microtime(true);
    }

    public function stop() {
        $this->stopTime = microtime(true);
    }

    public function spent() {
        if ($this->timeSpent) return $this->timeSpent;
        $this->timeSpent = round($this->stopTime - $this->startTime, 8);
        return $this->timeSpent . '秒';
    }
}

$timer = new Timer();
$timer->start();

$mysqli = new mysqli('localhost', 'root', 'root', 'ganbaobao_ucenter');

// 普通查詢(註解掉,僅作對比參考)
/*
$query = $mysqli->query("SELECT username, email FROM uc_members WHERE uid < 100000");
$result = [];
while ($row = $query->fetch_array()) {
    $result[] = ['name' => $row['username'], 'email' => $row['email']];
}
*/

// Prepared Statement 查詢
$stmt = $mysqli->prepare("SELECT username, email FROM uc_members WHERE uid < ?");
$id = 100000;
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($username, $email);

$result = [];
while ($stmt->fetch()) {
    $result[] = ['name' => $username, 'email' => $email];
}

$timer->stop();
echo '
預處理查詢 100000 條數據耗時: ' . $timer->spent(); unset($timer); ?>

實測效能數據對比

數據量普通查詢 (秒)Prepared Statement (秒)效能提升
1,000 條0.0116210.009632~17%
10,000 條0.0776690.046146~41%
100,000 條0.1083420.059899~45%

深度解析與最佳實踐

為何 Prepared Statement 更快?

  • 解析優化:SQL 語句只需解析、編譯、優化一次,後續執行直接複用執行計畫
  • 網路傳輸:二進制協議傳輸參數,減少封包大小
  • 緩存機制:MySQL 可緩存預處理語句的執行計畫

適用場景建議

  • 高頻重複查詢:如用戶登入驗證、商品列表分頁
  • 批量資料操作:大量 INSERT/UPDATE 時配合 execute() 循環
  • 安全性要求高:自動處理特殊字元轉義,有效防禦 SQL 注入

注意事項

  • 單次查詢或極簡單 SQL,Prepared Statement 可能因額外開銷略慢
  • MySQL 5.7+ 已優化查詢緩存,普通查詢效能差距縮小
  • 搭配連線池使用效果最佳,避免頻繁建立連線
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved