Home

Published

- 4 min read

字串前綴搜尋

img of 字串前綴搜尋

剛開始學習 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 開頭的範圍,然後快速返回結果,無需掃描整個表。

字串搜尋建議具體流程:

  1. 建立索引:當你在某個欄位(例如 name)上建立索引時,資料庫會記錄每個名字的前幾個字符,並按照一定順序排列。 這樣查詢時,資料庫可以直接根據這個順序快速定位以某個字串開頭的資料。

  2. 前綴搜尋(Prefix Search):當你查詢 LIKE 'RJ%' 時,因為 "RJ" 是前綴,資料庫可以快速找到所有以 "RJ" 開頭的資料, 因為索引就像字典一樣,它知道所有以 "R" 開頭的資料在哪裡開始和結束。

結論

其實我覺得還是可以依照實際資料庫的情況去決定,畢竟「前綴搜尋(Prefix Search)」實際上就是會少掉一部分的結果, 但如果資料量龐大,比如有會員的系統,要針對會員名字搜尋,也許就不太適合,畢竟速度還是網頁優不優良很重要的指標。 減少「全表搜尋(Full Table Scan)」還是比較好的實作觀念。

如果真的要什麼都能找到,那麼就建議使用 Elasticsearch 吧!