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

MySQL 自定義函數實戰:判斷視頻擴展名 (IS_MOBILE)

     編輯:MySQL 資料庫相關知識

應用場景

Sphinx 全文索引建構時,需標記行動裝置相容影片 (.mp4) 或特定標記 [ctvideo] 開頭的資料。

函數定義

DELIMITER ||

DROP FUNCTION IF EXISTS IS_MOBILE ||
CREATE FUNCTION IS_MOBILE(x VARCHAR(255)) RETURNS TINYINT(1)
BEGIN
    DECLARE result TINYINT(1) DEFAULT 0;
    SET x = LCASE(x);  -- 轉小寫不區分大小寫
    
    IF RIGHT(x, 4) = '.mp4' THEN
        SET result = 1;
    ELSEIF LEFT(x, 9) = '[ctvideo]' THEN
        SET result = 1;
    END IF;
    
    RETURN result;
END ||

DELIMITER ;

測試驗證

SELECT IS_MOBILE('https://example.com/video.mp4') AS m;  -- 返回 1
SELECT IS_MOBILE('[ctvideo]intro') AS m;                 -- 返回 1
SELECT IS_MOBILE('video.avi') AS m;                      -- 返回 0

效能與架構考量

⚠ 重要限制:
  • 每次查詢呼叫 UDF 會增加 CPU 開銷,不適合高頻 OLTP 查詢
  • 大量資料建議:應用層預處理 新增 is_mobile TINYINT DEFAULT 0 欄位,寫入時計算
  • 或使用 Generated Column (MySQL 5.7+):is_mobile TINYINT AS (RIGHT(LOWER(url),4)='.mp4' OR LEFT(LOWER(url),9)='[ctvideo]') STORED

現代替代方案對比

方案優點缺點適用場景
UDF (本例)SQL 內封裝邏輯、無需改應用效能差、難除錯、版本遷移麻煩臨時方案、報表查詢、ETL
應用層計算效能最好、易測試、語言生態豐富需修改寫入邏輯核心業務、高並發
Generated Column資料庫強制一致、可建索引、無觸發器開銷5.7+、ALTER TABLE 鎖表新專案、衍生欄位
視圖不佔儲存、邏輯集中不可建索引、複雜查詢效能差唯讀報表

最佳實踐建議

  1. 新系統: 直接在應用層 (PHP/Java/Go/Python) 判斷,寫入 is_mobile 欄位
  2. 舊系統改造: 加欄位 + 歷史資料回填腳本 + 應用雙寫過渡期
  3. 唯讀分析: 可用 UDF 或 View 封裝邏輯,避免汙染核心寫入路徑
  4. 索引需求: 若須 WHERE is_mobile=1 快速查詢,必須實體欄位 + 索引

本函數為臨時解決方案,後續已透過系統升級移至應用層處理。資料庫層面專注於儲存與索引,業務邏輯下沉應用層是架構演進的必然趨勢。

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