【postgresql初級使用】基于表達式或者函數的索引,字符串拼接可以使用索引了,帶來不一樣的優化效果

帶表達式的索引

?專欄內容

  • postgresql使用入門基礎
  • 手寫數據庫toadb
  • 并發編程

個人主頁:我的主頁
管理社區:開源數據庫
座右銘:天行健,君子以自強不息;地勢坤,君子以厚德載物.

文章目錄

  • 帶表達式的索引
  • 概述
  • 創建語法
  • 場景分析
    • 函數表達式
    • 普通表達式
  • 總結
  • 結尾

概述


在postgresql 中,一個索引不僅僅是基于表的一列或多列來創建,還可以基于函數,或者一個表達式來創建。

本文就來分享在postgresql 如何基于表達式來創建索引。

創建語法


基于表達式創建索引,它的SQL語法如下所示:

CREATE INDEX index_name 
ON table_name (expression);
  • index_name 指定當前索引的名稱 ;
  • ON子句 指定當前索引 引用的數據表;
  • expression 指定表達式內容;普通索引這里指定的是列名;

場景分析


在大數據時代,查詢語句各式各樣,過濾條件中帶有函數,字符拼接等等,組成各種條件變量,下面我們按不同場景來舉例說明。

函數表達式

經常會遇到將字符串轉換為小字,或者在大小寫不敏感時,就可以轉換為大寫或者小寫,再來比較。

有一張人員信息表,名字分為first_name,last_name兩部分,而名字又是大小字不敏感,所以經常轉換為小寫字符來比較。

postgres=> create table userInfo (uid integer primary key, first_name varchar, last_name varchar);
CREATE TABLEpostgres=> INSERT INTO userinfo(uid, first_name, last_name)
select id, 'firstname' || id::int, 'lastname'||id::int FROM generate_series(1, 100000) as id;
INSERT 0 100000

表中插入了10萬條測試數據。

經常使用的SQL查詢如下。

select * from userinfo where lower(first_name) = 'mar';

其中就用到了函數轉換,先將first_name轉為小寫,再參與條件比較。

看一下它的執行計劃。

postgres=> explain select * from userinfo where lower(first_name) = 'mar';QUERY PLAN
--------------------------------------------------------------Seq Scan on userinfo  (cost=0.00..2324.00 rows=500 width=31)Filter: (lower((first_name)::text) = 'mar'::text)
(2 rows)

可以看到它使用了seq scan也就是順序掃描,從表起始一條條進行遍歷,如果此類查詢非常頻繁的話,相當損耗性能。

這里使用帶有表達式的索引嘗試來優化一下。

postgres=> explain select * from userinfo where lower(first_name) = 'mar';QUERY PLAN
------------------------------------------------------------------------------------Index Scan using idx_expre_userinfo on userinfo  (cost=0.42..8.44 rows=1 width=31)Index Cond: (lower((first_name)::text) = 'mar'::text)
(2 rows)

可以看到執行計劃中,使用到了剛才創建的索引,而且執行估算時間也是大幅提升。

普通表達式

繼續使用上面的測試數據來看另外一種場景。

當我們需要查詢某個用戶名是否存在時,會經常使用如下SQL語句。

postgres=> select * from userinfo where (first_name || ' ' || last_name) = 'firstname9999 lastname9999';uid  |  first_name   |  last_name
------+---------------+--------------9999 | firstname9999 | lastname9999
(1 row)Time: 7.905 ms
postgres=> explain select * from userinfo where (first_name || ' ' || last_name) = 'firstname9999 lastname9999';QUERY PLAN
-----------------------------------------------------------------------------------------------------------Seq Scan on userinfo  (cost=0.00..2574.00 rows=500 width=31)Filter: ((((first_name)::text || ' '::text) || (last_name)::text) = 'firstname9999 lastname9999'::text)
(2 rows)Time: 0.234 ms

篩選條件中,先將first_name和last_name拼接起來,再進行比較。

可以看到執行計劃中使用了順序掃描方式,執行時間也到了毫秒級,同樣使用表達式索引來優化一下。

postgres=> create index idx_userinfo_name on userinfo ((first_name || ' ' || last_name));
CREATE INDEX
Time: 307.842 ms

創建一個基于名字拼接表達式的索引。

下面再來看一下查詢計劃的情況。

postgres=> explain select * from userinfo where (first_name || ' ' || last_name) = 'firstname9999 lastname9999';QUERY PLAN
---------------------------------------------------------------------------------------------------------------------Bitmap Heap Scan on userinfo  (cost=20.29..778.62 rows=500 width=31)Recheck Cond: ((((first_name)::text || ' '::text) || (last_name)::text) = 'firstname9999 lastname9999'::text)->  Bitmap Index Scan on idx_userinfo_name  (cost=0.00..20.17 rows=500 width=0)Index Cond: ((((first_name)::text || ' '::text) || (last_name)::text) = 'firstname9999 lastname9999'::text)
(4 rows)Time: 0.366 ms

可以看到剛才創建的索引被使用了 Bitmap Index Scan on idx_userinfo_name, 采用了bitmap掃描的方式;

下面看一下執行時間的變化。

postgres=> select * from userinfo where (first_name || ' ' || last_name) = 'firstname9999 lastname9999';uid  |  first_name   |  last_name
------+---------------+--------------9999 | firstname9999 | lastname9999
(1 row)Time: 0.274 ms

執行時間的提升,真得令人驚?,提升了二十來倍。

總結


以上就是本節的全部內容,在復雜的SQL查詢中,經常會用到各種表達式,字符運算,時間運算等,此時可以使用基于表達式或者函數的索引,使用索引進行優化效率。

結尾


非常感謝大家的支持,在瀏覽的同時別忘了留下您寶貴的評論,如果覺得值得鼓勵,請點贊,收藏,我會更加努力!

作者郵箱:study@senllang.onaliyun.com
如有錯誤或者疏漏歡迎指出,互相學習。

注:未經同意,不得轉載!

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

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

相關文章

Node.js —— 前后端的身份認證 之用 express 實現 JWT 身份認證

JWT的認識 什么是 JWT JWT(英文全稱:JSON Web Token)是目前最流行的跨域認證解決方案。 JWT 的工作原理 總結:用戶的信息通過 Token 字符串的形式,保存在客戶端瀏覽器中。服務器通過還原 Token 字符串的形式來認證用…

AIGC-風格遷移-“DEADiff:穩定可控的文本到圖像風格化擴散模型 “-CVPR2024

DEADiff: An Efficient Stylization Diffusion Model with Disentangled Representations 代碼:https://tianhao-qi.github.io/DEADiff/ 論文:https://arxiv.org/pdf/2403.06951 本文介紹了一種名為DEADiff的方法,旨在解決基于擴散的文本到圖…

【機器學習論文閱讀筆記】Robust Recovery of Subspace Structures by Low-Rank Representation

前言 終于要輪到自己匯報了好崩潰。。盯著論文準備開始做匯報ppt感覺一頭亂麻,決定還是寫博客理清思路再說吧 參考資料: 論文原文:arxiv.org/pdf/1010.2955 RPCA參考文章:RPCA - 知乎 (zhihu.com) 譜聚類參考文章&#xff1a…

Python使用pymysql操作數據庫

大家好,當涉及到與數據庫進行交互和操作時,Python的pymysql庫是一個常用且功能強大的選擇。pymysql提供了與MySQL數據庫的連接、查詢、插入、更新和刪除等操作的方法,使得在Python中進行數據庫操作變得簡單而高效。 1、安裝 pymysql 庫 在開…

面部捕捉 學習筆記

目錄 FaceShift Studio FaceRig Pro是一款功能強大的面部捕捉視頻制作軟件版 FaceShift Studio FaceShift人臉表情識別原理分析 - 知乎 FaceRig Pro是一款功能強大的面部捕捉視頻制作軟件版

Python3 筆記:部分專有名詞解釋

1、python 英 /?pa?θ?n/ 這個詞在英文中的意思是蟒蛇。但據說Python的創始人Guido van Rossum(吉多范羅蘇姆)選擇Python這個名字的原因與蟒蛇毫無關系,只是因為他是“蒙提派森飛行馬戲團(Monty Python's Flying Ci…

【靜態分析】在springboot使用太阿(Tai-e)01

參考:使用太阿(Tai-e)進行靜態代碼安全分析(spring-boot篇一) - 先知社區 ---------------------------------------------------------------------- 由于spring-boot實現了控制反轉與面向切面編程的設計思想&#x…

OpenHarmony輕松玩轉GIF數據渲染

OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)提供了Image組件支持GIF動圖的播放,但是缺乏擴展能力,不支持播放控制等。今天介紹一款三方庫——ohos-gif-drawable三方組件,帶大家一起玩轉GIF的數據渲染,搞…

如何在JS中克隆對象

在JavaScript中,克隆對象并不是直接支持的操作,因為JavaScript中的對象是通過引用傳遞的,而不是通過值傳遞。但是,你可以使用幾種不同的方法來"克隆"或"復制"一個對象。 1. 淺拷貝(Shallow Copy&…

二手車經營效率羅盤,用經營效率羅盤玩轉二手車生意

課程下載:https://download.csdn.net/download/m0_66047725/89292198 更多資源下載:關注我。 帶你了解不一樣的二手車圈讓二手車經營更高效 課程介紹 隨著時代不斷發展,二手車行業迎來了快速變革期。二手車有著一車一況、一車一價非標和價…

無人機+飛行服務:無人機飛防服務(打藥+施肥+播種)技術詳解

無人機飛防服務,結合了先進的無人機技術與農業實踐,為現代農業提供了高效、精準的打藥、施肥和播種解決方案。以下是對這些技術的詳細解析: 一、無人機打藥技術 無人機打藥技術利用無人機搭載噴霧設備,對農田進行精準施藥。通過…

【數倉系列】maxcompute、postgresql、sparksql等行轉列數據處理實戰總結(其他類型持續總結更新)

1.熟悉、梳理、總結項目研發實戰中的SQL開發日常使用中的問題、經驗總結,都是常用的開發技能,可以省去很多時間,時間長就忘記了 2.歡迎點贊、關注、批評、指正,互三走起來,小手動起來! 文章目錄 1.maxcompu…

關于java.nio.file 包--用于文件和文件系統操作的核心包之一

java.nio.file 包是 Java 中用于文件和文件系統操作的核心包之一。這個包提供了許多類和接口,用于在 Java 虛擬機中訪問文件、管理文件屬性和操作文件系統。主要的功能包括: 1.訪問文件和目錄: java.nio.file.Files 類提供了許多靜態方法,用于…

【Crypto】看我回旋踢

文章目錄 一、看我回旋踢二、知識點什么是ROT13?工作原理分析字符串格式 解題感悟 一、看我回旋踢 關鍵詞回旋,盲猜ROT13 因為以 synt{ 開頭,并以 } 結束,基本可以判斷是ROT13 小小flag,拿下! 二、知識點 …

抖音極速版:抖音輕量精簡版本,新人享大福利

和快手一樣,抖音也有自己的極速版,可視作抖音的輕量精簡版,更專注于刷視頻看廣告賺錢,收益比抖音要高,可玩性更佳。 抖音極速版簡介 抖音極速版是一個提供短視頻創業和收益任務的平臺,用戶可以通過觀看廣…

leetcode-560 和為k的數組

一、題目描述 給你一個整數數組 nums 和一個整數 k ,請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 注意:nums中的元素可為負數 輸入:nums [1,1,1], k 2 輸出:2輸入:num…

裝飾乙級資質延期申請的注意事項

在申請裝飾乙級資質延期時,企業需要注意以下幾個重要事項: 提前了解政策和要求: 企業應提前了解并熟悉資質延期的相關政策和要求,包括所需材料、辦理流程、時間限制等。這有助于企業做好充分準備,避免在申請過程中出現…

【機器學習聚類算法實戰-5】機器學習聚類算法之DBSCAN聚類、K均值聚類算法、分層聚類和不同度量的聚集聚類實例分析

🎩 歡迎來到技術探索的奇幻世界👨?💻 📜 個人主頁:一倫明悅-CSDN博客 ?🏻 作者簡介: C軟件開發、Python機器學習愛好者 🗣? 互動與支持:💬評論 &…

MYSQL課堂練習

學生表:studentsno,sname,ssex,sage,sdept)學號,姓名,性別,年齡,所在系 sno為主鍵課程表:Course(cno,cname,) 課程號,課程名 cno為主鍵 學生選課…

申報照明工程設計乙級資質關于財務審計報告的要求

申報照明工程設計乙級資質時,關于財務審計報告的要求通常包括以下幾點: 審計報告類型:需要提供由具有法定資質的會計師事務所出具的財務審計報告。如果是企業已經運營滿一個會計年度,應提交最近一個完整會計年度的年度審計報告。如…