无锁加索引
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 服务节点之间因为机器时钟不同步导致的"时间倒流"问题。