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
is_mobile TINYINT DEFAULT 0 欄位,寫入時計算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 鎖表 | 新專案、衍生欄位 |
| 視圖 | 不佔儲存、邏輯集中 | 不可建索引、複雜查詢效能差 | 唯讀報表 |
is_mobile 欄位WHERE is_mobile=1 快速查詢,必須實體欄位 + 索引本函數為臨時解決方案,後續已透過系統升級移至應用層處理。資料庫層面專注於儲存與索引,業務邏輯下沉應用層是架構演進的必然趨勢。