Insights·2026-09-16

存储与 CDN 是什么 — 文件放在哪里

数据库是适合装名字、日期和数字的表结构,照片和视频不是该塞进那些格子里的东西。塞进去,每次查询都会连着沉重的一坨一起被拖出来。所以文件另外放在存储里,数据库只记路径。在此之上,把常用文件的副本预先铺到世界各地、从近处送出的这张网就是 CDN,而「网站很慢」的抱怨相当一部分都是从这一层开始的。

파일은 스토리지에 두고 표에는 경로만 적는다 — 글의 요약 도식

为什么图片不放进表里

上一篇说数据库长得像电子表格,是适合一行行堆名字、日期和数字的结构。

照片和视频不是该塞进那些格子的东西。概念上是能塞的,只是效率不行。

原因在于取用的方式。为了画一个列表画面可能要查二十行,如果每一行里都整个装着图片,那些在画面上根本不会显示的图片也会被一并拖出来。数据库不是为这种沉重的一坨频繁往返而造的工具。

所以要分开。文件本身放进文件仓库,数据库里只记这个文件在哪里的路径。

表里只放路径
posts 表
─────────────────────────────────────────────
id  title      cover_path
1   第一篇     /uploads/2026/09/cover-1.webp
2   第二篇     /uploads/2026/09/cover-2.webp

① 画面查询 posts 读出 cover_path
② 再用那个路径单独向存储请求文件

存储与第二次请求

放文件的仓库叫存储。服务小的时候可能就是服务器里的一个文件夹,大了就单独用专门的文件服务。

在这个结构里,画面要请求两次。先问后端要值、拿到路径,再用那个路径单独请求文件。浏览器遇到图片地址会自己发出第二次请求,所以不需要人操心。

把给值的一方和给文件的一方分开,还能各用各的服务器。值由擅长应答值的服务器负责,文件由擅长送文件的服务器负责。活儿性质不同,分开各自更在行。

CDN — 处理距离与频次的那一层

对比图:常被请求的文件预先放在就近节点,很少被请求的文件则在有请求时才回源获取。

这里还要加一件事:距离问题。

假设图片放在美国的服务器上,而看的人在韩国。请求要顺着海底光缆横跨太平洋。一行文字倒还好,图片视频这种大块头每次都跑这么远的往返,就慢了。

所以要预先铺副本。把常用文件复制到世界各地的节点,请求来了就由离这个人最近的节点送出。这张网叫 CDN,是内容分发网络的缩写。

它也处理频次。网站 logo 每位访客都会取,而冷门文章的图片几乎没人取。前者值得一直备在近处,后者不如等请求真的来了再从源站取。替你做这个判断,就是这一层在干的事。

层放什么决定什么
数据库值与文件路径哪些值如何相连
存储文件原件放在哪里才安全
CDN常用文件的副本给谁从哪里送出

「网站很慢」大半从这里开始

用柱状图对比:画面上只有400像素宽的位置,却发送了4000像素的原图文件。

接到变慢的反馈,容易先去翻代码。实际上多半是这一层。

要查的项目是固定的几样。图片是不是原尺寸就发出去了?画面上只显示 400 像素宽的位置却送了 4000 像素的文件,那些时间就白白扔掉了。

还要看格式。同一张图,用为网页而生的格式会轻得多。然后看距离和缓存:副本是不是从近处送出的,已经取过一次的文件有没有配置成浏览器不必再取。

打开浏览器开发者工具的网络面板,哪个文件花了多久一目了然。动代码之前先看这里,答案通常就出来了。下一篇是最后一篇,讲把这一整套搬到另一台电脑上。