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

MySQL 5.0.2+ 服務端游標完整解析:特性、限制與適用場景

     編輯:MySQL 資料庫相關知識

背景

MySQL 5.0.2 引入服務端游標,透過 C API mysql_stmt_attr_set() 設定 STMT_ATTR_CURSOR_TYPE 為 CURSOR_TYPE_READ_ONLY 啟用。游標讓結果集留在服務端,客戶端按需逐行或分批抓取,減少網路傳輸與客戶端記憶體壓力。

核心特性

  • 唯讀:不可透過游標更新/刪除資料
  • 不支援 WHERE CURRENT OF:無 UPDATE/DELETE WHERE CURRENT OF cursor 語法
  • 非持久:COMMIT 後游標自動關閉
  • 不敏感:游標開啟後,底層資料變更不影響已生成的結果集
  • 不可捲動:僅支援 NEXT 方向,無 PRIOR/FIRST/LAST/ABSOLUTE/RELATIVE
  • 未命名:Statement handle 即游標 ID,無額外命名機制
  • 每預處理語句僅能開啟一個游標:需多游標請建立多個 PREPARE 語句

不支援游標的語句

以下語句在預處理模式下不支援,故無法使用游標:

  • CHECK TABLE
  • HANDLER READ
  • SHOW BINLOG EVENTS
  • 其他不支援預處理的語句

適用場景

  1. 大結果集分頁處理:應用端僅需前 N 行,避免一次性傳輸百萬行資料
  2. 串流式 ETL:逐行讀取、轉換、寫入下游,記憶體佔用恆定
  3. 長時間運行的報表查詢:配合 mysql_stmt_fetch() 非阻塞輪詢,避免客戶端超時

C API 使用骨架

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

結語

MySQL 服務端游標功能精簡、限制明確,定位於「唯讀、單向、非持久」的串流消費場景。若需雙向捲動、可更新游標或長事務持久化,請在應用層實現邏輯或評估其他資料庫方案。

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