WeHelp
字串前綴搜尋
2024-10-07 00:06:50
剛開始學習 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](https://www.elastic.co/elasticsearch) 吧! --- #### 本文章同步分享於我的部落格 [RJ Wanna Say Something](https://ssuj-chang.github.io/post/string_prefix_search/)
sql