【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.mzph.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为主键 学生选课…

申报照明工程设计乙级资质关于财务审计报告的要求

申报照明工程设计乙级资质时,关于财务审计报告的要求通常包括以下几点: 审计报告类型:需要提供由具有法定资质的会计师事务所出具的财务审计报告。如果是企业已经运营满一个会计年度,应提交最近一个完整会计年度的年度审计报告。如…