Repository navigation
v6.8.15
6.8.14 的图片 ID 已按发布时间生成 UUIDv7,却另存一份 image_time 用于排序、游标、索引、Redis 投影和接口输出;单值的主题、作者、标签筛选写成 = ANY(数组),PostgreSQL 回源无法沿 (筛选值, 时间) 索引按序取数,时间上集中的标签和稀有主题在数据量大时明显变慢。本版以图片 ID 为发布时间的唯一来源,metadata.image_time 暂时保留供回退,只在入库时随 ID 写入,后续版本再删除,请勿自行删列(本版仍会写入并在启动时核对该列)。升级须停机:先停止应用并备份,用 SELECT count(*) FROM metadata WHERE uuid_extract_timestamp(id) <> image_time; 确认结果为 0(不为 0 时升级后这些图片的排序与显示时间会按 ID 改变),清空 ImageShow 使用的 Redis 逻辑库(管理员需重新登录,未完成的上传与导入作废),再在数据库执行下方 DDL,然后启动新版本;应用不自动修改数据库。
BEGIN;
ALTER TABLE metadata ALTER COLUMN image_time DROP DEFAULT;
ALTER TABLE metadata ADD CONSTRAINT metadata_id_check CHECK (uuid_extract_version(id) = 7);
CREATE INDEX idx_metadata_status_id ON metadata(status, id DESC);
CREATE INDEX idx_metadata_ready_id ON metadata(id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_device_id ON metadata(device, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_brightness_id ON metadata(brightness, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_device_brightness_id ON metadata(device, brightness, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_device_theme_id ON metadata(device, theme, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_brightness_theme_id ON metadata(brightness, theme, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_axes_id ON metadata(device, brightness, theme, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_theme_id ON metadata(theme, id DESC) WHERE status = 'ready';
CREATE INDEX idx_metadata_ready_author_id ON metadata(author, id DESC) WHERE status = 'ready';
DROP INDEX idx_metadata_status_image_time, idx_metadata_ready_image_time, idx_metadata_ready_device_image_time, idx_metadata_ready_brightness_image_time, idx_metadata_ready_device_brightness_image_time, idx_metadata_ready_device_theme_image_time, idx_metadata_ready_brightness_theme_image_time, idx_metadata_ready_axes_image_time, idx_metadata_ready_theme_image_time, idx_metadata_ready_author_image_time, idx_metadata_ready_random_axes;
COMMIT;refactor:
- 公开与后台列表、游标和派生索引构建一律按
id排序与翻页,按时间排序的游标只编码图片 ID,升级时正在翻页的访客会收到一次invalid_cursor,刷新即可(经 CDN 缓存列表接口时,旧游标可能在缓存期内仍会出现);Redis 投影条目去掉sort_score,有序集合分数改为 ID 中的毫秒时间。 - 内容接入的会话、上传意图与丢弃回执不再另存解析后的时间,入库时
image_time由uuid_extract_timestamp(id)写入。 - 随机 API 的 JSON、图片详情、后台列表与接入结果不再返回
image_time(随机 API 公开字段变化),图片时间可由 ID 的前 48 位得到;图片详情直接从 ID 显示发布时间,不再等待详情返回。 - 数据库结构以 10 个
(筛选列, id)索引替换image_time索引并删除与之重复的随机轴索引,image_time去掉默认值,新增uuid_extract_version(id) = 7约束。
perf:
- 单值主题、作者、标签筛选改写为等号,公开分页把同一游标边界并入标签成员子查询。dev 上以两个版本实际发出的 SQL 测 PostgreSQL 回源:17,456 张真实数据下标签首页 37.1 → 3.3 ms、标签随机回源 7.9 → 4.5 ms,其余列表普遍快 5%~20%;按原时间分布合成的 349,120 张下标签首页 530 → 0.84 ms、稀有主题首页 38 → 0.54 ms,主题、作者、标签的随机回源由 16~279 ms 降到 2~61 ms;派生索引分批构建快约 40%,metadata 索引体积减少约 20%,Redis 投影条目内存减少约 1.5%、读延迟不变;17k 标签中间页与 349k「电脑 + 浅色」首页分别慢约 1.2 ms 与 0.5 ms。
fix:
- 图片详情的标签行在标签加载出来时由文字高度撑高到标签高度,下方内容随之跳动;现在标签行在加载中、无标签与有标签时同为 24px,与单行标签同高,其他属性行保持原行高。
- 访问过的来源链接在详情加载成功的瞬间先闪出亮色边框再回落(加载占位与可用链接共用同一元素,已访问配色从文字色过渡到边框色);现在两者是不同元素,链接直接以最终样式出现。
test:
- 测试夹具按 UUIDv7 生成图片 ID 并写入与 ID 一致的
image_time,游标、筛选参数与接入身份断言改为现行契约,删除只验证已移除字段的断言;公开分页场景补充按标签筛选、两个方向逐页翻页的断言。
docs:
- 随机图 API 说明去掉
image_time字段并注明 ID 的前 48 位是图片时间;架构与内容接入参考改为以图片 ID 为发布时间的唯一来源。