首页 > 数据库 >提升项目数据查询速度:从pgsql数据库性能到SQL优化的实战经验分享

提升项目数据查询速度:从pgsql数据库性能到SQL优化的实战经验分享

时间:2023-07-01 21:23:49浏览次数:40  
标签:数据库 查询 pgsql 索引 字段 实战经验 SQL data

最近在项目中遇到这样一个问题,在进行数据查询的时候,特别的慢。

项目的基本情况

首先描述下项目的使用情况,数据库使用的是postgresql关系型数据库,主要数据存储字段data使用的类型是JSONB。

data字段存储数据,这个数据是包含了不少的图元,特别是在性能测试中,加入了特别多的图元 信息,最大的一条已经达到了3000多个SVG形成的图元。

查询分析

查询data字段长度,按照MB计算

SELECT id, DATA->>'name' AS filename , length(data::text)/1024/1024 AS leMB FROM t_re_data_inf AS trdi ORDER BY leMB DESC ;

查询的结果可以看到,最大的一条数据,这个data字段已经到19MB了,这个数据中的键值已经达到了4万多个。

image

检查查询执行的SQL,发现会查询的是整一个data字段,查询速度就比较慢,实际业务分析发现,实际是不需要整个的数据,只需要data其中的十几个键值就行。这样返回给前端的数据就会小一点,能减少查询时间,详细就如方案一的设计。

优化方案一

去使用查询功能执行SQL,查询data中的一个键值,发现查询的速度在350毫秒左右。而在实际的业务场景中,查询的键值有十多个,在整体查询的时候,查询速度就在3.5秒左右了,这对整个业务执行来说是属于太慢了。在没有其他方式的时候也能作为一个备选方案。

select data->>'name' from data_info

优化方案二

采用索引的方式去减少查询时间。去检查在这个data字段中有没有存在一些索引,帮助去提升查询效率。实际发现没有相关的索引字段,然后根据索引的常见规则,去创建一些索引。

   SELECT indexname ,indexdef,tablename FROM pg_indexes WHERE tablename = 'data_info'

这里需要注意,在创建索引的时候,需要注意几点:

CREATE INDEX data_info_id_idx ON meta.data_info (id);

  • 确保索引字段不经常变动

  • 确保索引字段是有唯一性的,没有大量的重复

  • 使用索引的时候,是跟在where字段后面的

在使用索引后,实际的查询效率没有提升很大,也就放弃了这种方案,但是在一些其他的项目中,可以通过创建索引的方式去提升查询的效率。

优化方案三

在pgsql数据库本身性能的层面去优化查询的效率。

根据网上是一些文章,主要设置的参数包括:

  • max_connections 设置客户端允许的最大连接数为100
  • fsync on 强制将数同步更新到磁盘,修改为off
  • shared_buffers 用做为缓存的数据,推荐设置为内存的1/4,不超1/2最好,能减少IO
  • work_mem 用于提高内部排序操作的,设置值为1MB
  • effective_cache_size 设置查询可用的最大内存,推荐设置为内存的1/2

实际上,设置了相关参数以后,实际的效率没有得到提升,说明在这个时候,数据库本身的性能是已经到了比较好的性能。

总结

在尝试优化的过程,已经从多方面进行了设置。总结出来,在遇见查询速度慢的时候,可以从几方面去分析,一是数据库本身性能层面去分析,一方面从索引方面去分析,还有就是优化查询SQL本身。

标签:数据库,查询,pgsql,索引,字段,实战经验,SQL,data
From: https://www.cnblogs.com/tomes/p/17519939.html

相关文章

  • sql总结
    故事背景最近一个月,我制定了一个计划,安排了LeetCode的MySQL题目以及每周末的编程竞赛。我的主要目标包括以下几点:提升编码能力:LeetCode提供了许多不同难度的MySQL题目,通过解决这些问题,我可以加强自己的SQL编码能力,并学习各种SQL语句和技巧。锻炼逻辑思维:在解决LeetCode的问题过程中......
  • 在 MySQL中,如何定位慢查询?(SQL调优,调优经验)
    一、什么业务场景会出现慢查询的现象 聚合查询 多表查询 表数据量过大查询 深度分页查询  表象:页面加载过慢、接口压测响应时间过长(超过1s)二、如何定位慢查询? 1、介绍以下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测的结果大概5秒钟) ......
  • postgresql离线安装及双机热备
    前言:本文是做主库的热备份到从库,即主库中的数据即时备份到从库,第1-5步是要在主机和备机都要执行,第6步是主机的数据库初始化,第8步是备机的数据库初始化1.安装依赖(主机,备机)root用户在一台有网的电脑上先下载好所需的依赖yuminstall--downloadonly--downloaddir=/tmp/zlib-d......
  • 多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docke
    多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docker+Uniapp+Vue3随着移动互联网的快速发展和智能手机的普及,代驾服务成为了一个日益火热的行业。在这个行业中,如何构建一个具备商业级可靠性和扩展性的代驾业务系统成为了关键问题。本文将介绍一......
  • ThinkPHP6.0 链式SQL语句
    ThinkPHP6.0 链式SQL语句查询单个数据$user=Db::query('select*from`user`');$user=Db::table('user')->where('UserID',1001)->find();//查询结果为空返回null$user=Db::table('user')->where('UserID',1001)->findO......
  • 从mysql主从复制原理分析故障及延时场景!
    在很多的情况下生产环境所发生的问题,实际上都可以通过其工作原理来解决例如:mysql主从复制原理:  1.当用户在主库中写入数据时,将sql语句的执行写入binlog二进制文件中2.从库会生成一个i/o线程用来监听binlog日志文件的变化,若binlog文件发生变化,那么i/o线程将会提取binlog日志......
  • IDEA MyBatis Log 插件,打印SQL语句
    打开Settings->plugins搜索插件MyBatisLog点击安装,完成后重启IDEA即可。点击Tools,选择MyBatisLogPlugin,会在下方打开一个窗口,这个窗口会输出mapper执行的SQL语句。......
  • MySQL联合索引生效验证
    建表、添加数据,用于测试CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`gid`varchar(20)NOTNULL,`cid`int(11)DEFAULTNULL,`uid`int(11)DEFAULTNULL,`name`varchar(255)CHARACTERSETutf8COLLATEutf8_general_ciDEFAULTNULL,PRIMARYKEY......
  • jmeter接口测试 -- 连接数据库(MySQL)
    三个步骤一、下载MySQL的连接驱动1、先查看MySQL的版本1)服务器上查看:mysql--version 2)在连接工具上查看 2、下载连接驱动,下载地址:https://dev.mysql.com/downloads/connector/j/1)选择系统(windows系统才选择我下图中......
  • 启动mysql时报错Failed to start mysqld.service: Unit not found
    问题描述:启动mysql时报错Failedtostartmysqld.service:Unitnotfound,如下所示:数据库:mysql5.7.42系统:rhel7.31、问题重现--mysql安装过程[root@leo-mysql-master~]#yumlocalinstallhttps://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm[root@leo......