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 服务节点之间因为机器时钟不同步导致的"时间倒流"问题。
相关推荐
爱写代码的阿森16 分钟前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_34 分钟前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白1 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面2 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧2 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈2 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy2 小时前
log4net 数据库存日志正确配置
数据库
liuxiaowei33 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba
破碎的南瓜3 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql