PostgreSQL之索引/函数/触发器

无锁加索引

sql 复制代码
CREATE INDEX CONCURRENTLY idx_xxxxx_updated_at ON xxxxx (updated_at DESC);

检验是否生效

sql 复制代码
EXPLAIN ANALYZE SELECT MAX(updated_at) FROM xxxxx;

如果你的生产环境表里已经有很多数据,且服务正在运行,直接 CREATE INDEX 可能会锁表 ,导致你的 heartbeat(心跳)更新不进去。

在 PostgreSQL 中,建议使用 CONCURRENTLY 关键字。它允许在创建索引时不阻塞表的写入

触发器更新 updated_at

sql 复制代码
- 1. 创建一个通用的更新函数(只需建一次)
CREATE OR REPLACE FUNCTION update_timestamp_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$ language 'plpgsql';

-- 2. 给表挂上触发器(每个表挂一次)
CREATE TRIGGER update_xxxxx_modtime
    BEFORE UPDATE ON xxxxx
    FOR EACH ROW
    EXECUTE FUNCTION update_timestamp_column();
  • 绝对一致:无论你是用 Go 代码更新、用 psql 手动改数据、还是将来加了别的运维脚本,updated_at 都会强制更新。
  • 代码清爽:你的 repo 里的 SQL 语句不需要写 updated_at = now(),SQL 会短很多。
  • 时间统一:始终以数据库服务器的时间为准,避免了多台 Go 服务节点之间因为机器时钟不同步导致的"时间倒流"问题。
相关推荐
余槐i2 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹2 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo2 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台4 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见6 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见6 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing20236 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶6 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课7 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析