pgsql创建函数索引

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

记一次生产优化事件

就在本周项目发布到生产环境,发现有个页面渲染出整个页面所花费的时间比较久,大概5s时间是有的,这对于页面的整体体验是不被允许的。因为生产涉及隐私,所以笔者记录大致执行伪逻辑,仅供参考。

项目背景:查询近十年来所有的事件信息:(年份查询是默认必传的)

于是我就通过后台实际操作了一下,看下耗时。具体情况是这样的:生产数据大概是60几万条数据,通过执行sql语句,大概执行的时间是3s多,这个查询效率显然是不能接受的。

执行sql大致如下:

select 
	业务字段
from 
	tableName
where
	to_char(create_date_mc,'yyyy')
and
	... -- 其它的查询条件(因业务需要,大量的to_char函数)
order by create_date_mc desc

通过navcat解释发现该表并没有创建索引,根据以往的经验来说,几十万条数据如果创建索引的情况下,就算加上IO的开销,一般来说时间应该是毫秒级别的,3s的查询肯定是不能被接受的,于是我便考虑到在时间字段上面加上索引,时间字段取年份进行查询。

通过查阅资料理解到,在 Postgresql 中,可以使用 CREATE INDEX 命令来创建索引,同时也可以使用函数来创建索引。本文将介绍如何使用 CREATE INDEX 和 to_char() 函数来创建一个字段的索引:
CREATE INDEX 索引名 ON 表名 (to_char(字段名));

示例:

CREATE INDEX index_create_date_mc_tochar ON tableName (to_char(create_date_mc,'yyyy'));

在上面的示例中,我们创建了一个名为 index_create_date_mc_tochar 的索引,它将表 tableName 中的 create_date_mc 字段转换为按年份查询,并将结果存储在索引中。

通过创建索引,执行时间由3s多,现在执行时间接近1s,还是有所提高的,因为业务处理相对复杂,2s多的提升还是比较可观的,因为最终实际展示在页面的数据只需要预先处理一年的数据(大概一万条数据,就算不加索引,执行时间可能就几十毫秒),而不需要初始的时候展示全量数据。

小经验

一般来说,像这种大批量数据查询的时候,渲染的时候可以进行分页处理,不需要一次性展示所有数据,也是在实际开发中一种优化手段。前端进行分页查询的方式中,可以将查询结果一次性全部加载到前端,然后通过 JavaScript 对数据进行分页和展示。这种方式的优点是:

  1. 减少了用户等待的时间,因为只需要等待少量数据的加载。
  2. 减少了网络传输的数据量,因为只需要传输少量数据。
  3. 减少了网络传输的数据量,因为只需要传输少量数据。

另外,前端进行分页查询还有以下优点:

  1. 可以根据实际需要进行自定义的分页展示效果,例如滚动加载、下拉刷新等。
  2. 可以实现更加细致的客户端分页逻辑,例如根据搜索关键字进行实时过滤、根据用户交互动态加载等。

综上所述,前端进行分页查询可以大大提高查询效率和用户体验,特别是在数据量较大的情况下,更加显著。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值