三種擴展函數途徑對比
| 維度 | UDF (User Defined Function) | 內建函數 (Native) | 儲存函數 (Stored Function) |
| 實作語言 | C/C++ | C/C++ | SQL |
| 編譯產物 | 共享目標檔 (.so/.dll) | 編譯進mysqld | 無編譯,SQL定義 |
| 部署方式 | 安裝目標檔 + CREATE FUNCTION | 修改原始碼重編譯mysqld | CREATE FUNCTION SQL語句 |
| 二進制發布相容 | ✓ 可直接加載 | ✗ 需原始碼 | ✓ 通用 |
| 升級維護 | 升級後保留(介面未變時) | 每次升級需重複修改 | 升級無影響 |
| 效能 | 高(原生代碼) | 最高(內聯優化) | 較低(SQL解析執行) |
| 安全性 | 需FILE權限、共享庫路徑風險 | 核心代碼風險 | 受SQL權限系統控制 |
UDF開發核心要點
- 系統必須支援動態載入
- mysqld必須為動態編譯(非static)
- 共享庫需置於動態連結器搜尋路徑(
LD_LIBRARY_PATH等)
- 需
mysql資料庫INSERT權限建立,DELETE權限移除
- 資訊儲存於
mysql.func系統表,啟動時自動載入
UDF安全機制
--allow-suspicious-udfs控制:預設拒絕無輔助符號的共享庫
--skip-grant-tables啟動時跳過UDF初始化(不可用)
- 聚合函數需
mysql.func有type欄位(mysql_fix_privilege_tables建立)
CREATE/DROP FUNCTION語法
CREATE [AGGREGATE] FUNCTION function_name
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME shared_library_name
DROP FUNCTION function_name
function_name:SQL中呼叫的函數名
RETURNS:回傳型別聲明
SONAME:共享庫基礎檔名(不含路徑/副檔名)
AGGREGATE:聲明為聚合函數(如SUM/COUNT)
選擇建議
- 效能敏感、複雜計算、需C庫 → UDF
- 核心功能、極致效能、願意維護分支 → 內建函數
- 業務邏輯封裝、快速迭代、團隊SQL技能強 → 儲存函數
MySQL 8.0+引入使用者定義函數(UDF)的C++ API增強與儲存函數的DETERMINISTIC優化,進一步縮小三者效能差距。選型應優先考慮維護成本與團隊能力。