Published
- 4 min read
字串前綴搜尋

剛開始學習 SQL 語法的時候,對於字串的搜尋,大家肯定不陌生,就是 LIKE
下去,要搜尋的目標字串前後都加上 %
,
就可以很輕鬆地找到所有跟目標字串相關的字串,不過在資料龐大的狀況下,這樣搜尋會有些效能上的疑慮。
通配符
%
是「通配符(wildcard)」,用來代表任意數量的任意字符。
搭配 LIKE
具體來說:
LIKE '%RJ%'
:查找包含 RJ 的字串。LIKE '%RJ'
:查找以 RJ 結尾的字串。LIKE 'RJ%'
:查找以 RJ 開頭的字串。
在進行查詢時,%
的位置會影響 SQL 引擎如何進行檢索,且與資料庫的索引(index)優化有關。
前綴使用通配符的效能問題
當你使用 LIKE '%RJ%'
或 LIKE '%RJ'
這種形式時,因為 %
是通配符,資料庫必須掃描整個欄位的所有值,逐個字元比對以尋找匹配的結果。
這種情況下,資料庫無法利用索引來加速查詢,導致「全表搜尋(Full Table Scan)」故效能較差。
原因為索引通常是基於資料的「前綴」進行儲存與查詢的,索引可以快速定位某個範圍內的資料。
但是當查詢條件是 %RJ%
或 %RJ
,因為開頭部分是「未知」的任意字符,資料庫無法使用索引來直接匹配開頭,
必須查看所有可能的位置,因此不得不掃描整個表或大範圍的資料來找到匹配的值。
後綴使用通配符的效能優化
LIKE 'RJ%'
這種情況下,如上提到資料庫就可以利用索引來加速查詢。
因為它查詢的是以特定字串開頭的值,可以利用 B-tree 或其他形式的索引進行高效匹配。
資料庫只需要找到那些以 RJ 開頭的範圍,然後快速返回結果,無需掃描整個表。
字串搜尋建議具體流程:
-
建立索引:當你在某個欄位(例如
name
)上建立索引時,資料庫會記錄每個名字的前幾個字符,並按照一定順序排列。 這樣查詢時,資料庫可以直接根據這個順序快速定位以某個字串開頭的資料。 -
前綴搜尋(Prefix Search):當你查詢
LIKE 'RJ%'
時,因為"RJ"
是前綴,資料庫可以快速找到所有以"RJ"
開頭的資料, 因為索引就像字典一樣,它知道所有以"R"
開頭的資料在哪裡開始和結束。
結論
其實我覺得還是可以依照實際資料庫的情況去決定,畢竟「前綴搜尋(Prefix Search)」實際上就是會少掉一部分的結果, 但如果資料量龐大,比如有會員的系統,要針對會員名字搜尋,也許就不太適合,畢竟速度還是網頁優不優良很重要的指標。 減少「全表搜尋(Full Table Scan)」還是比較好的實作觀念。
如果真的要什麼都能找到,那麼就建議使用 Elasticsearch 吧!