PostgreSQL使用LIKE右模糊沒有走索引分析驗證

建表&數據初始化可參考PostgreSQL 分區表——范圍分區SQL實踐

背景:

t_common_work_order_loghandle_user_name新建索引后,使用LIKE右模糊匹配查詢時,發現走的全表掃描

CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name);
EXPLAIN ANALYZE SELECT COUNT( * ) 
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'張秀%';

在這里插入圖片描述

分析:

由于handle_user_name已經建了索引,查詢資料發現B-tree索引需要特定的運算符類別(如text_pattern_opsvarchar_pattern_ops )才能讓LIKE右模糊生效

PostgreSQL 索引運算符類:text_ops 與 text_pattern_ops 的區別

在 PostgreSQL 中,text_opstext_pattern_ops 是兩種不同的運算符類(operator class),它們決定了索引如何支持不同類型的文本比較操作。

text_ops (默認運算符類)

  • 使用數據庫的默認排序規則(LC_COLLATE)
  • 支持所有標準的文本比較操作(=, <, >, <=, >=)
  • 適用于常規的相等性檢查和排序操作
  • 對于使用 LIKE 或正則表達式等模式匹配操作的查詢效率較低

text_pattern_ops

  • 忽略語言環境特定的排序規則,使用簡單的逐字符比較
  • 專門優化了以 LIKE~ 開頭的模式匹配查詢
  • 特別適合前綴搜索(如 column LIKE 'abc%')
  • 不支持常規的 <, > 等比較操作
  • 不適用于需要遵循語言特定排序規則的查詢

使用場景示例

-- 使用默認的 text_ops (適合常規比較)
CREATE INDEX idx_name ON users (name);-- 使用 text_pattern_ops (適合模式匹配)
CREATE INDEX idx_name_pattern ON users (name text_pattern_ops);

注意事項

  1. 如果查詢混合了常規比較和模式匹配,可能需要創建兩個索引
  2. text_pattern_ops 索引對于 LIKE '%suffix' 這樣的后綴搜索沒有幫助
  3. 對于不區分大小寫的模式匹配,考慮使用 citext 類型或表達式索引

選擇哪種運算符類取決于具體查詢模式。如果主要進行前綴搜索或模式匹配,text_pattern_ops 會提供更好的性能。

確認指定索引的運算符類別

relname輸入實際的索引名稱,通過查詢結果可知當前的handle_user_name索引的運算符類別為默認的text_ops

SELECTi.relname AS index_name,a.attname AS column_name,opc.opcname AS operator_class
FROMpg_index xJOIN pg_class i ON i.oid = x.indexrelidJOIN pg_attribute a ON a.attrelid = x.indrelid AND a.attnum = ANY(x.indkey)JOIN pg_opclass opc ON opc.oid = ANY(x.indclass)
WHEREi.relname = 'order_log_handle_user_name_index';
index_namecolumn_nameoperator_class
order_log_handle_user_name_indexhandle_user_nametext_ops

修改運算符類別為text_pattern_ops

-- 刪除舊索引
DROP INDEX IF EXISTS order_log_handle_user_name_index;-- 創建新索引(使用text_pattern_ops)
CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name text_pattern_ops);

回退sql

-- 刪除舊索引
DROP INDEX IF EXISTS order_log_handle_user_name_index;-- 創建新索引(使用text_pattern_ops)
CREATE INDEX order_log_handle_user_name_index ON t_common_work_order_log (handle_user_name text_ops);

驗證

EXPLAIN ANALYZE驗證

修改運算符類別為text_pattern_ops再次執行EXPLAIN ANALYZE,可知LIKE右模糊查詢索引生效
在這里插入圖片描述

查詢速度對比

計算方法:查詢10次,去掉最大和最小取平均值

默認運算符類別 3.585s

-- 3.510s 3.722s 3.485s 3.732s 3.478s 3.558s 3.729s 3.511s 3.599s 3.564s
SELECT *
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'張秀%';

text_pattern_ops運算符類別 2.116s

-- 1.753s 2.296s 2.102s 2.159s 2.167s 2.055s 2.048s 2.169s 2.334s 1.934s
SELECT *
FROMt_common_work_order_log 
WHEREhandle_user_name LIKE'張秀%';

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78197.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vue】【element-plus】 el-date-picker使用cell-class-name進行標記,type=year不生效解決方法

typedete&#xff0c;自定義cell-class-name打標記效果如下&#xff1a; 相關代碼&#xff1a; <el-date-pickerv-model"date":clearable"false":editable"false":cell-class-name"cellClassName"type"date"format&quo…

《Learning Langchain》閱讀筆記8-RAG(4)在vector store中存儲embbdings

什么是 vector store&#xff1f; 與專門用于存儲結構化數據&#xff08;如 JSON 文檔或符合關系型數據庫模式的數據&#xff09;的傳統數據庫不同&#xff0c;vector stores處理的是非結構化數據&#xff0c;包括文本和圖像。像傳統數據庫一樣&#xff0c;vector stores也能執…

用api的方式調用本地下載好的大模型(以llama為例,不是ollama!!!)

目錄 1、創建虛擬環境2、激活虛擬環境3、安裝相關庫4、編寫腳本&#xff08;test.py&#xff09;調用腳本5、bash中測試通信完美結果 1、創建虛擬環境 conda create -n myenv python3.12 -y2、激活虛擬環境 conda activate myenv3、安裝相關庫 pip install vllm fastapi uvi…

算力網絡(CFN)在跨校聯合科研中的應用:安全性挑戰與聯邦調度實踐

引言&#xff1a;科研協作的算力困境 上海交通大學與麻省理工學院聯合開展的高能物理模擬實驗&#xff0c;因算力資源分配不均導致部分節點連續72小時處于空轉狀態。這個典型案例揭示了當前跨機構科研協作的痛點&#xff1a;?算力資源無法實現安全可信的細粒度共享?。算力網…

高防IP+CDN組合:電商大促的“雙保險”防護方案

引言 電商大促期間&#xff0c;平臺流量呈爆發式增長&#xff0c;既要應對瞬時激增的訪問量&#xff0c;又要防范黑客趁機發起的DDoS攻擊、惡意爬蟲等威脅。單一防護手段往往難以兼顧性能與安全&#xff0c;而高防IPCDN組合通過“流量清洗加速分發”的雙重機制&#xff0c;為電…

# 構建詞匯表:自然語言處理中的關鍵步驟

構建詞匯表&#xff1a;自然語言處理中的關鍵步驟 在自然語言處理&#xff08;NLP&#xff09;任務中&#xff0c;詞匯表&#xff08;Vocabulary&#xff09;是文本數據預處理的核心組件之一。它將文本中的單詞或字符映射為數值索引&#xff0c;從而讓計算機能夠理解和處理語言…

SQL進階知識:七、數據庫設計

今天介紹下關于數據庫設計的詳細介紹&#xff0c;并結合MySQL數據庫提供實際例子。 數據庫設計是確保數據庫能夠高效、安全地存儲和管理數據的關鍵環節。良好的數據庫設計可以提高查詢性能、減少數據冗余、確保數據完整性&#xff0c;并簡化數據維護。以下是關于數據庫設計的詳…

python如何取消word中的縮進

在python-docx中&#xff0c;取消縮進可以通過將相應的縮進屬性設置為None或0來實現。以下是取消不同類型縮進的方法&#xff1a; 取消左縮進 from docx import Documentdoc Document(existing_document.docx)for paragraph in doc.paragraphs:# 取消左縮進paragraph.paragr…

Docker拉取鏡像代理配置實踐與經驗分享

Docker拉取鏡像代理配置實踐與經驗分享 一、背景概述 在企業內網環境中&#xff0c;我們部署了多臺用于測試與學習的服務器。近期&#xff0c;接到領導安排&#xff0c;需在其中一臺服務器上通過Docker安裝n8n應用程序。然而在實際操作過程中&#xff0c;遭遇Docker官方鏡像庫…

【數字圖像處理】立體視覺基礎(1)

成像 成像過程&#xff1a;三維空間坐標到二維圖像坐標的變換 相機矩陣&#xff1a;建立三維到二維的投影關系 相機的使用步驟&#xff08;模型-視圖變換&#xff09;&#xff1a; &#xff08;1&#xff09;視圖變換 &#xff08;2&#xff09;模型變換 &#xff08;3&…

實驗4:列表與字典應用

目的 &#xff1a;熟練操作組合數據類型。 試驗任務&#xff1a; 1. 基礎&#xff1a;生日悖論分析。如果一個房間有23人或以上&#xff0c;那么至少有兩個人的生日相同的概率大于50%。編寫程序&#xff0c;輸出在不同隨機樣本數量下&#xff0c;23 個人中至少兩個人生日相同的…

c++之網絡編程

網絡編程&#xff1a;使得計算機程序能夠在網絡中發送和接受數據&#xff0c;從而實現分布式系統和網絡服務的功能。 作用&#xff1a;使應用程序能夠通過網絡協議與其他計算機程序進行數據交換 基本概念 套接字&#xff08;socket&#xff09;&#xff1a; 套接字是網絡通信…

【Harmony_Bug】forEach + asyncawait 的異步陷阱

一、問題描述 今天在做一個RDB的小項目時&#xff0c;遇到一個問題&#xff0c;因為沒報錯其實也是不算是BUG&#xff0c;以下描述時我就直接說關鍵點&#xff0c;其他代碼忽略。 我的數據模型初始化有六條數據如圖 在持久化層&#xff0c;通過initUserData這個方法執行插入。…

大腸桿菌誘導蛋白時OD600=0.6-0.8添加IPTG的思考-實驗操作系列-009

一、為什么用OD600表示菌液濃度&#xff1f; 1. 光密度與吸光值的關系 OD600是指在600納米波長下的光密度&#xff08;Optical Density&#xff09;&#xff0c;也就是通過細菌懸浮液的光的吸收程度。根據比爾-朗伯定律&#xff0c;光密度與溶液中光學活性物質&#xff08;如…

OpenHarmony - 小型系統內核(LiteOS-A)(十),魔法鍵使用方法,用戶態異常信息說明

OpenHarmony - 小型系統內核&#xff08;LiteOS-A&#xff09;&#xff08;十&#xff09; 十四、魔法鍵使用方法 使用場景 在系統運行出現無響應等情況時&#xff0c;可以通過魔法鍵功能確定系統是否被鎖中斷&#xff08;魔法鍵也無響應&#xff09;或者查看系統任務運行狀態…

CUDA編程之Grid、Block、Thread線程模型

一、線程模型:Grid、Block、Thread概念 ?1. 層級定義? ?Thread(線程)? CUDA中最基本的執行單元,對應GPU的單個CUDA核心(SP)。每個線程獨立執行核函數指令,擁有獨立的寄存器和局部內存空間?。 ?Block(線程塊)? 由多個線程組成(通常為32的倍數),是邏輯上的并…

實戰交易策略 篇十九:君山居士熊市交易策略

文章目錄 系列文章熊市三大特征熊市操作思維強勢重勢,弱勢重質搶反彈重要前提和五大原則反彈逃頂操盤其他炒股的至高境界力戒“三進三出”八大心理誤區八大戒律股市不敗之法系列文章 實戰交易策略 篇一:奧利弗瓦萊士短線交易策略 實戰交易策略 篇二:杰西利弗莫爾股票大作手…

Flutter IOS 真機 Widget 錯誤。Widget 安裝后系統中沒有

錯誤信息&#xff1a; SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…

【計算機視覺】CV實戰項目 - 深入解析基于HOG+SVM的行人檢測系統:Pedestrian Detection

深入解析基于HOGSVM的行人檢測系統&#xff1a;從理論到實踐 技術核心&#xff1a;HOGSVM檢測框架HOG特征原理SVM分類器 項目架構與數據準備INRIA Person數據集目錄結構 實戰指南&#xff1a;從零構建檢測系統環境配置完整訓練流程檢測應用 關鍵技術問題與解決方案1. 難例挖掘不…

day01_編程語言介紹丶Java語言概述丶開發環境搭建丶常用DOS命令

編程語言介紹 ?編程語言是一種用于人與計算機之間通信的語言&#xff0c;允許程序員編寫代碼&#xff0c;這些代碼告訴計算機要執行哪些操作?。編程語言可以被視為計算機可以理解并執行的指令集合&#xff0c;它是一種標準化的交流技巧&#xff0c;用于向計算機發出指令。?…