# 以下配置从 /etc/filetype/config.json 中加载 CREATE INDEX...
创建于:2025年5月28日
创建于:2025年5月28日
CREATE INDEX %s.%s_video ON %s(suffix) WHERE suffix IN ('mp4','avi','mkv','mov','wmv','flv','webm','m4v','3gp','3gp2','mpeg','mpg','ts','m2ts','mts','tp','trp','vob','ogv','ogm','divx','rm','rmvb','asf','qt','f4v','swf','h264','h265','hevc','vp8','vp9','av1','dat','avs');
CREATE INDEX %s.%s_photo ON %s(suffix) WHERE suffix IN ('jpg','jpeg','png','gif','bmp','webp','tiff','tif','heic','heif','avif','svg','ico','pcx','pict','psd','psp','thm','yuv','ai','indd','eps','jp2','j2k','jpf','jpx','jxl','jpm','mj2','raw','cr2','cr3','nef','arw','dng','orf','rw2','pef','srw','raf','mrw','x3f','nrw','dcr','kdc','3fr','mef','erf','srw','iiq');
CREATE INDEX %s.%s_document ON %s(suffix) WHERE suffix IN ('pdf','doc','docx','xls','xlsx','ppt','pptx','txt','csv','rtf','odt','ods','odp','odg','odf','sxw','sxc','sxi','wpd','tex','md','markdown','pages','numbers','key','html','htm','xhtml','xml','json','yaml','yml','log','ini','conf','cfg','dotx','wps','wpt','xltx','pot','potx','ppsx');
CREATE INDEX %s.%s_audio ON %s(suffix) WHERE suffix IN ('mp3','wav','ogg','flac','aac','m4a','wma','alac','ape','aiff','au','mid','midi','amr','ac3','dts','ra','ram','3ga','opus','aif','aifc','caf','dsf','dff');
CREATE INDEX %s.%s_archive ON %s(suffix) WHERE suffix IN ('zip','rar','7z','tar.gz');
要这样建索引吗?如果索引变动的时候,要改数据库吗?
下面从「可行性」「维护成本」「变动时的操作」三方面来回答。
方案 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
单列完整索引<br>CREATE INDEX idx_suffix ON files(suffix); | 查询经常直接 WHERE suffix = 'mp4' 或 IN (...) ,且写入量较大 | ・只有一个索引,维护简单<br>・适配所有后缀 | ・扫描范围比部分索引大,若写入多读少浪费 I/O |
分类型「部分索引」(你现在的写法) | 查询经常带固定分类条件:<br>...WHERE suffix IN ('mp4','avi',...) | ・每个索引只包含该分类行数,读性能好<br>・可以并行/分步创建或删除 | ・需要维护多条索引 DDL<br>・写入时会多次检查谓词,写放大 |
计算列 + 单列索引<br>先新增 file_type 虚拟列(Video/Photo…),再对 file_type 建普通索引 | 后缀种类经常增删改,分类逻辑清晰 | ・索引谓词稳定,只改计算列逻辑即可<br>・扩展/调整新后缀不用改索引 | ・需要额外列或表达式索引支持 |
总结:如果
- 查询读多写少,且每次都带类别过滤 —— 继续用 部分索引。
- 后缀列表经常变化、写入比较频繁 —— 考虑用 计算列 + 普通索引,或干脆只保留一个 suffix 全索引。
只改后缀列表(例如给 video 加 m2v
):
sql-- 并行、不锁表地重建 CREATE INDEX CONCURRENTLY idx_video_new ON files(suffix) WHERE suffix IN ('mp4', 'avi', ..., 'm2v'); -- 回收旧索引 DROP INDEX CONCURRENTLY idx_video;
修改表结构(列名、数据类型变更)
改存储引擎/集群拓扑
REINDEX
或迁移脚本。CREATE INDEX CONCURRENTLY
& DROP INDEX CONCURRENTLY
,避免长时间锁表。pg_stat_user_indexes
或 EXPLAIN
检查命中率;若部分索引长期 0 usage,可以下线。若后缀分类很少变且查询高并发,用你现在的“按分类部分索引”即可;
若后缀经常增删,请考虑“计算列 + 单列索引”或直接一个完整索引,并用迁移脚本管理索引重建。