首頁
編程語言
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,即可啟用服務端游標。結果集在服務端生成並暫存,客戶端透過 mysql_stmt_fetch() 按需抓取,未請求的行不傳輸,大幅降低網路流量與客戶端記憶體佔用。

七大核心限制(必讀)

  1. 唯讀:不可執行 UPDATE/DELETE WHERE CURRENT OF cursor
  2. 非持久:COMMIT 或 ROLLBACK 後游標自動關閉
  3. 不敏感:游標開啟後,底表資料異動不反映在已生成結果集
  4. 不可捲動:僅支援順向 NEXT,無 PRIOR/FIRST/LAST
  5. 未命名:Statement handle 即游標識別,無額外命名空間
  6. 一語句一游標:單 PREPARE 僅能 OPEN 一次,多游標需多 PREPARE
  7. 語句限制:CHECK TABLE、HANDLER READ、SHOW BINLOG EVENTS 等不支援預處理的語句無法使用游標

典型應用場景

  • 百萬級結果集分頁/串流處理
  • ETL 管線逐行轉換寫入下游
  • 長查詢非阻塞輪詢,避免客戶端超時

C API 關鍵調用序列

MYSQL_STMT *stmt = mysql_stmt_init(conn);
mysql_stmt_prepare(stmt, "SELECT id, data FROM big_table WHERE id > ?", -1);
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);

結語

MySQL 服務端游標定位精準:唯讀、單向、非持久、串流消費。在「大結果集、低記憶體、高延遲網路」的三重約束下,它是 C/C++、Go、Python (MySQLdb/oursql) 等原生驅動的高效利器。應用層若需雙向捲動或可更新游標,請自行實現邏輯緩存。

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