<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 關于gsql在模糊查詢中執行過程中不走索引的問題,可以通過 pg_trgm+gin索引來實現。 > pg_trgm擴展是用于字符串的相似度匹配的,在一些情況下也可以拿來代替全文檢索做字符匹配,因此需要配合gin索引類型(倒排索引)一起使用。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;關于pgsql在模糊查詢中執行過程中不走索引的問題,一開始以為命中數據量越大會導致不走索引,后來分析了這個擴展的原理之后發現,是否走索引是根據提供的搜索字符串個數有關。<br> **前置條件:** 1. 安裝pg_trgm擴展 2. 對需要模糊搜索的字段創建倒排索引 ``` // 查看已安裝的擴展 postgres=# select * from pg_extension; oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition -------+----------------+----------+--------------+----------------+------------+-----------+-------------- 13566 | plpgsql | 10 | 11 | f | 1.0 | | 16439 | first_last_agg | 10 | 2200 | t | 0.1.4 | | 16446 | pg_trgm | 10 | 2200 | t | 1.5 | | (3 rows) // 對event_desc 字段創建gin類型索引 postgres=# CREATE INDEX index_attack_alarm_event_desc ON "public"."alerts" USING gin (event_desc gin_trgm_ops); CREATE INDEX postgres=# select * from pg_indexes where tablename='alerts' and indexname='index_attack_alarm_event_desc'; schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+-------------------------------+------------+------------------------------------------------------------------------------------------------- public | alerts | index_attack_alarm_event_desc | | CREATE INDEX index_attack_alarm_event_desc ON public.alerts USING gin (event_desc gin_trgm_ops) (1 row) ``` **pg_trgm擴展實現原理:** 1. 將字符串的前端添加2個空格,末尾添加1個空格 2. 每連續的3個字符標記為一個TOKEN 3. 對TOKEN建立GIN倒排索引 ``` // 比如 字符串 'abc',會在前后添加前后兩個空格之后,連續3個字符拆分標記為TOKEN,并建立倒排索引 postgres=# select show_trgm('abc'); show_trgm ------------------------- {" a"," ab",abc,"bc "} (1 row) ``` **根據實現原理分析pg\_trgm擴展的使用場景:** 1. 有前綴的模糊查詢,例如a%,**至少需要提供1個字符**。(搜索的是token \='a') 2. 有后綴的模糊查詢,例如%ab,**至少需要提供2個字符**。(搜索的是token ='ab') 3. 前后模糊查詢,例如%abcd%,**至少需要提供3個字符**。(這個使用數組搜索,搜索的是token包含了{“a”,“ab”,abc,bcd,“cd”}) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也就是說,前綴模糊,至少需要輸入一個字符才能走索引;后綴模糊至少需要兩個字符才能走索引,而全模糊查詢,至少需要三個字符才能走索引。<br> **驗證分析:** **場景1:** 前綴模糊查詢,匹配一個字符,命中30w+數據,結果會經過索引 ![](https://img.kancloud.cn/a5/1f/a51f6113ae0c899c532a43ac8b006d0c_1002x462.png) **場景2:** 后綴模糊,僅匹配一個字符不會走索引,跟命中數據量無關,需要兩個字符串以上才會 ![](https://img.kancloud.cn/61/8e/618eded149d0f9a047cfd694bdc6588b_963x382.png) **場景3:** 全模糊,匹配兩個字符不會走索引,跟命中數據量無關,需要三個字符串以上才會 ![](https://img.kancloud.cn/a4/1d/a41dff157c5f3d6055c80ebf930499df_988x360.png)<br> **在全模糊情況下,bree索引和gin索引的語句耗時對比如下:** 1、 event\_desc字段創建btree索引,全模糊搜索三個字符沒有走索引,語句耗時2.6s,命中40w+ ![](https://img.kancloud.cn/e7/0b/e70b9ec7adf646efbbeb9b29ddc0df3a_1334x769.png) 2、使用pg_trgm和gin索引,全模糊搜索三個字符會走索引,語句耗時2.4s,命中40w+ ![](https://img.kancloud.cn/2b/07/2b07da1fee30ce1e104d6e946a1f99ce_1323x771.png)<br> **pg_trgm擴展測試結論:** 1. 對應的字段需要使用gin索引類型(倒排索引),創建此耗時比btree索引長約10倍(980w數據重建索引,數據越大耗時越長),對數據實時插入表的性能影響未知 2. 此擴展的使用場景,后綴模糊需要輸入兩個字符串以上,全模糊需要輸入三個字符串以上,才會走索引。可能不滿足真實業務場景(真實業務場景可能是:全模糊搜索兩個字符就走索引) 3. 在聚合場景,命中40w+數據情況下,雖然有走索引,但是對比btree索引查詢耗時未明顯下降,效果不明顯
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看