表 user 欄位 purview VARCHAR(255) 儲存 '1,2,3,4,5',查詢擁有權限 1 的用戶。
SELECT * FROM `user` WHERE FIND_IN_SET('1', `purview`);
FIND_IN_SET(str, strlist):在逗號分隔字串 strlist 中搜尋 str,找到返回位置(1-based),否則返回 0'1' 不會匹配 '11' 或 '1,2' 中的 '11',因為以逗號為邊界utf8_general_ci 不敏感EXPLAIN SELECT * FROM user WHERE FIND_IN_SET('1', purview);
-- type: ALL(全表掃描)
資料量 > 10 萬時查詢明顯變慢。大規模場景建議:
| 方案 | 優點 | 缺點 |
|---|---|---|
| 規範化:關聯表 user_purview (user_id, purview_id) | 索引支援、ACID、標準關聯查詢 | 寫入稍複雜、需 JOIN |
| JSON 欄位 (MySQL 5.7+) | JSON_CONTAINS 可用虛擬欄位索引 | 版本要求、學習成本 |
| 全文索引 + MATCH AGAINST | 支援多值搜尋 | 分詞邏輯、精確匹配難控制 |
| 應用層快取權限位圖 | 極快、無資料庫壓力 | 一致性維護複雜 |