首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL vs MySQLi vs PDO:連接模式、性能、預處理、最佳實踐深度解析

     編輯:MySQL 綜合教學

三大 API 對比

特性mysql (已棄用)mysqliPDO
PHP 版本< 5.5 移除>= 5.0>= 5.1
面向對象不支援支援支援
預處理語句不支援支援支援
多數據庫僅 MySQL僅 MySQL支援 12+ 驅動
事務控制函數式OO + 函數OO
異步查詢不支援支援不支援

連接模式深度解析

  • mysql_connect:短連接,每次請求建立、關閉 TCP 連接,開銷大。
  • mysql_pconnect:長連接(進程級連接池),PHP-FPM 模式下進程復用連接,減少握手開銷,但易導致「太多連接」、事務殘留、鎖不釋放。
  • mysqli:默認短連接,mysqli::real_connect 可配置持久連接(MYSQLI_CLIENT_PERSISTENT),行為同 pconnect。
  • PDO:PDO::ATTR_PERSISTENT => true 啟用持久連接,同樣需謹慎。

代碼範例

mysqli 面向過程

$conn = mysqli_connect('localhost', 'root', '123', 'db_test');
$sql = "SELECT * FROM db_table";
$res = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($res)) echo $row['title'];

mysqli 面向對象

$conn = new mysqli('localhost', 'root', '123', 'db_test');
$res = $conn->query("SELECT * FROM db_table");
while ($row = $res->fetch_assoc()) echo $row['title'];

PDO(推薦生產)

$pdo = new PDO('mysql:host=localhost;dbname=db_test;charset=utf8mb4', 'root', '123', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,  // 真實預處理
]);
$stmt = $pdo->prepare("SELECT * FROM db_table WHERE id = ?");
$stmt->execute([$id]);
while ($row = $stmt->fetch()) echo $row['title'];

最佳實踐建議

  1. 新項目強制使用 PDO:跨庫遷移無痛、真實預處理防注入、異常模式統一。
  2. 嚴禁 mysql_* 函數:PHP 7 已完全移除。
  3. 生產環境慎用持久連接:除非極高 QPS 且經過壓測驗證,否則短連接 + 連接池(如 ProxySQL)更可控。
  4. 預處理 + 參數綁定:杜絕 SQL 拼接,防注入、執行計劃復用。
  5. 字符集顯式指定:DSN 加 charset=utf8mb4 或 $pdo->exec("SET NAMES utf8mb4")。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved