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 服务节点之间因为机器时钟不同步导致的"时间倒流"问题。
相关推荐
CCYe、11 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
疯狂打码的少年12 小时前
【数据库技术】SQL嵌套查询(IN/EXISTS/ANY/ALL)
数据库·笔记·sql
清晨00112 小时前
国产化数据库替代方案:openGauss 详解与 MySQL 平滑迁移实战
数据库·mysql
λqaq712 小时前
MongoDB数据库基础 :非关系型数据库入门与常用操作
数据库·学习·mongodb·nosql
词却12 小时前
数据库基础:TCL事务与DDL视图
数据库
码农小麦12 小时前
LangChain 1.3.18 + DeepSeek-v4-flash 工具调用踩坑实录
网络·数据库·langchain
FfHUCisI12 小时前
Golang 切片扩容策略
开发语言·数据库·golang
en.en..12 小时前
Ubuntu嵌入式开发 export环境变量
java·开发语言·数据库
攻城有术12 小时前
专项攻克——重写 Redis 依赖包方法的 6 种实现方式
java·数据库·redis·bootstrap
二进制漫游记13 小时前
PostgreSQL超详细入门教程:Windows安装+Python异步连接+完整增删改查实战
python·postgresql