为什么需要 archives 分表?
随着网站运行时间的增长,dede_archives 这张表会变得异常庞大,可能包含几十万甚至上百万条记录,这会带来一系列问题:

- 查询速度变慢:对文章列表、搜索、关联查询等操作会越来越慢,因为数据库需要在海量数据中扫描。
- 索引效率降低:即使对
id、typeid、sortrank等字段建立了索引,当数据量超过某个阈值后,索引的效率也会下降。 - 数据库维护困难:数据量大,备份、恢复、优化等操作都会耗费大量时间和资源。
- 服务器负载增高:频繁的慢查询会增加数据库服务器的 CPU 和 I/O 负载。
archives 分表的核心思想就是将一张大表,按照某种规则(通常是时间或栏目),拆分成多个小表,这样,每次查询只需要扫描其中一个或少数几个小表,从而极大地提升查询效率。
archives 分表的原理
DedeCMS 的分表机制是基于 前缀 的,它会在原表名 dede_archives 的基础上,加上一个后缀,形成新的表名。
- 主表(默认表):
dede_archives - 按年分表:
dede_archives_2025,dede_archives_2025 - 按栏目分表:
dede_archives_1,dede_archives_2(1, 2 是栏目ID)
在后台进行操作时(如发布文章、查看列表),DedeCMS 的程序会根据当前的时间或栏目ID,自动计算出应该操作哪一张表,对用户来说是完全透明的。
如何实现 archives 分表?(以按年分表为例)
这是最常用、最合理的分表方式,下面是详细的操作步骤:

步骤 1:创建分表
你需要手动在数据库中创建新的分表,这些新表的结构必须和 dede_archives 完全一致。
-
登录你的数据库管理工具(如 phpMyAdmin)。
-
找到
dede_archives的结构:选中dede_archives表,点击“结构”或“Structure”,记下所有字段和定义。 -
创建新表:执行 SQL 语句来创建新表,最简单的方法是直接复制原表结构。
(图片来源网络,侵删)-- 创建 2025 年的文章表 CREATE TABLE `dede_archives_2025` LIKE `dede_archives`; -- 创建 2025 年的文章表 CREATE TABLE `dede_archives_2025` LIKE `dede_archives`; -- 以此类推,为你需要的年份创建表 -- CREATE TABLE `dede_archives_2025` LIKE `dede_archives`;
LIKE关键字会快速复制一个表的结构,但不会复制数据。
步骤 2:修改 DedeCMS 配置文件
你需要告诉 DedeCMS 系统你有哪些分表。
-
打开
/include/config_base.php文件。 -
找到
$cfg_archives_table配置项,这行定义了文章表的主表名和分表名的规则。 -
修改其值,默认值可能是
dede_archives,你需要修改为包含所有分表名的格式。修改前:
// 文档表主表 $cfg_archives_table = 'dede_archives';
修改后(按年分表示例):
// 文档表主表,这里定义了所有分表,用逗号隔开。 // 系统会根据发布日期自动将文章存入对应的表。 $cfg_archives_table = 'dede_archives,dede_archives_2025,dede_archives_2025';
注意:
- 第一个表名
dede_archives是主表,通常用于存放一些特殊文章或作为默认表。 - 后面跟着的是你创建的所有分表,用英文逗号 分隔。
- 如果未来增加了新的年份(如 2025),你需要再次修改这个配置文件,并创建
dede_archives_2025表。
- 第一个表名
步骤 3:测试分表功能
分表环境已经搭建完成,我们来测试一下。
- 发布一篇新文章:登录 DedeCMS 后台,进入“[核心]-[内容发布]-[添加文档]”。
- 设置文章的发布时间:在文章编辑页,找到“发布时间”选项,将其设置为你已经创建分表的年份之一,
2025-10-26 10:00:00。 - 保存并发布文章。
- 检查数据库:回到你的数据库管理工具,查看
dede_archives和dede_archives_2025这两张表。- 你会发现,
dede_archives表里可能没有这篇文章,或者这篇文章的typeid等信息被移动到了主表,而具体的文章内容在dede_archives_2025表中。 - 更准确地说,DedeCMS 会将文章数据插入到它认为最合适的表中,对于按年分表,它通常会根据
pubdate(发布时间) 字段来决定,你可以直接在dede_archives_2025表中查找你刚发布的文章。
- 你会发现,
验证查询:
- 在后台“[核心]-[内容管理]-[所有文档]”中,你应该能看到你刚刚发布的文章。
- 系统会自动从正确的分表中读取数据并展示出来,这个过程对你是透明的。
其他分表策略
除了按年分表,还有其他分表策略,但各有优劣。
按栏目分表
- 原理:为每个主栏目创建一个独立的文章表,如
dede_archives_1(对应栏目ID为1的栏目)。 - 优点:当某个栏目内容特别多时,查询该栏目下的文章速度极快。
- 缺点:
- 跨栏目查询困难:比如在首页显示最新文章,需要同时查询所有分表,性能反而可能更差。
- 栏目数量多时,表数量爆炸:如果有100个栏目,就要创建100个分表,管理非常不便。
- 适用场景:少数几个栏目内容量极大,且基本不进行跨栏目聚合查询的网站。
按时间(季度、月)分表
- 原理:比按年更细,如
dede_archives_2025Q1,dede_archives_2025Q2或dede_archives_202510。 - 优点:表更小,查询效率更高。
- 缺点:
- 表数量增长快:一年4个季度或12个月,几年下来就有几十上百个表。
- 配置和管理更复杂。
- 适用场景:新闻资讯类等更新极其频繁、内容量爆炸的网站。
重要提示:按年分表是 DedeCMS 官方推荐且最均衡的方案,对于绝大多数网站来说已经足够。
注意事项与常见问题
-
备份数据!备份数据!备份数据! 在进行任何数据库操作(尤其是创建表、修改配置)之前,务必备份数据库,一旦操作失误,可能导致数据丢失。
-
历史数据如何处理? 分表功能只对新发布的文章有效,你现有的、存在于
dede_archives主表中的海量历史数据不会自动移动到新分表中。- 解决方案:你可以编写脚本或手动将这些历史数据按年份导出,再导入到对应的分表中,这是一个非常耗时且风险高的操作,通常建议在网站初期规划好分表,或者在数据量还不大时进行。
-
插件和二次开发兼容性 一些老旧的或非官方的插件可能没有考虑到分表的情况,其直接操作
dede_archives表的 SQL 查询可能会失效,升级或安装插件后要仔细测试。 -
数据迁移问题 如果你将来需要将网站迁移到新的服务器或环境,需要确保所有分表(
dede_archives,dede_archives_2025,dede_archives_2025...)都被完整地导出和导入。 -
查询全站文章 后台的“所有文档”功能依然可以正常工作,因为它会查询所有在
$cfg_archives_table中定义的表,但如果分表过多,这个页面的加载速度也会变慢。
| 特性 | 描述 |
|---|---|
| 核心目的 | 解决 dede_archives 数据量过大导致的查询性能瓶颈。 |
| 实现原理 | 通过创建多个结构相同、后缀不同的表(如 archives_2025),由程序根据规则(如时间)自动路由数据。 |
| 关键配置 | 修改 /include/config_base.php 文件中的 $cfg_archives_table 变量。 |
| 推荐方案 | 按年分表,在每年年初创建新表(如 archives_2025),并更新配置文件,这是最通用、最稳妥的方案。 |
| 适用场景 | 内容量较大、运行时间较长、对性能有要求的网站。 |
| 重要提醒 | 操作前务必备份数据库;分表不影响旧数据,只对新数据有效。 |
希望这份详细的指南能帮助你成功为你的 DedeCMS 网站实现 archives 分表,提升网站性能!
