字串前綴搜尋
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/)
點擊複製文章連結
X