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

MySQL 伺服器端游標限制完整清單:唯讀、不可持久、不支援捲動與預處理語句綁定

     編輯:MySQL 資料庫相關知識

背景

MySQL 5.0.2+ 透過 C API mysql_stmt_attr_set(STMT_ATTR_CURSOR_TYPE, CURSOR_TYPE_READ_ONLY) 實作伺服器端游標,允許結果集留在伺服器端按需取回,減少網路傳輸。

八大硬性限制

限制項目說明影響
唯讀不可透過游標 UPDATE/DELETE WHERE CURRENT OF需另行發送 DML 語句
不可持久COMMIT/ROLLBACK 後自動關閉跨事務不可重用
不敏感結果集建立後不反映後續資料變更類似 INSENSITIVE 游標
不可捲動僅支援 FETCH NEXT,無 ABSOLUTE/RELATIVE/PRIOR單向流式讀取
無名稱以預處理語句句柄識別,無 DECLARE CURSOR name應用層管理句柄對應
單語句單游標一個預處理語句僅能開啟一個游標多游標需準備多個語句
不支援語句類型CHECK TABLE、HANDLER READ、SHOW BINLOG EVENTS 等此類語句無法使用游標
預處理模式限制若語句不支援預處理,則無法使用游標需確認語句可 PREPARE

適用場景與效能效益

  • 大結果集分頁:LIMIT 1000000, 20 → 游標定位後僅傳輸 20 行。
  • 流式處理:ETL、報表產生、資料同步,避免客戶端記憶體暴增。
  • 配合 mysql_stmt_fetch_column() 按需取欄位,進一步減少傳輸。

程式碼範例 (C API)

MYSQL_STMT *stmt = mysql_stmt_init(mysql);
mysql_stmt_prepare(stmt, "SELECT id, data FROM big_table WHERE category=?", strlen(...));
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*)CURSOR_TYPE_READ_ONLY);
mysql_stmt_bind_param(stmt, &bind_param);
mysql_stmt_execute(stmt);
mysql_stmt_bind_result(stmt, &bind_result);

while (mysql_stmt_fetch(stmt) == 0) {
    // 處理單行
}
mysql_stmt_close(stmt);

替代方案對比

方案優點缺點
伺服器端游標減少網路傳輸、客戶端記憶體低功能受限、需 C API、連線佔用久
LIMIT/OFFSET 分頁簡單、通用深分頁效能差 (全掃描+排序)
Keyset Pagination高效、無深分頁問題需唯一排序鍵、不支援隨機跳頁
應用層快取極快資料陈舊、一致性複雜

結語

伺服器端游標是特定場景 (大結果集流式讀取) 的優化工具,非通用替代方案。受限於唯讀、單向、非持久等特性,現代應用多採用 Keyset Pagination + 應用層快取 組合,僅在 ETL/報表等後台批次作業考慮游標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved