自 MySQL 5.0.2 起,透過 C API mysql_stmt_attr_set() 設定 STMT_ATTR_CURSOR_TYPE = CURSOR_TYPE_READ_ONLY,即可啟用服務端游標。結果集在服務端生成並暫存,客戶端透過 mysql_stmt_fetch() 按需抓取,未請求的行不傳輸,大幅降低網路流量與客戶端記憶體佔用。
UPDATE/DELETE WHERE CURRENT OF cursorCOMMIT 或 ROLLBACK 後游標自動關閉NEXT,無 PRIOR/FIRST/LASTPREPARE 僅能 OPEN 一次,多游標需多 PREPARECHECK TABLE、HANDLER READ、SHOW BINLOG EVENTS 等不支援預處理的語句無法使用游標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) 等原生驅動的高效利器。應用層若需雙向捲動或可更新游標,請自行實現邏輯緩存。