先看成果
官方演示站 teayear.com 全量导入中文维基 1,702,561 篇文章,在 RyeBlog 1.4.2 上:文章页 3 毫秒、搜索 3 毫秒、首页冷启动 2.6 秒、55 万标签页 88KB 分页。以下为沉淀到系统的优化点与开关。
数据库层(自动生效)
- 复合索引:vd_posts 建 (type,status,created_at) 与 (type,status,category_id,created_at),列表/分类查询 FORCE INDEX 杜绝 filesort;
- 上一篇/下一篇按主键定位:文章页相邻导航走主键范围(禁止按 created_at 排序,百万级会全表 filesort);
- 归档月计数物化表 vd_archive_stats:归档页读 O(1),发布/删除自动维护(后台可重建);
- 评论数批量加载:列表页一次 IN 查询取全部卡片评论数,消灭 N+1。
缓存层(后台「高级设置 → 性能优化」开关)
- 整页缓存 page_cache:游客页面整体缓存(首页/列表/归档/搜索/标签/feed/sitemap),命中不再执行 PHP 与数据库;登录/评论者自动跳过;
- page_cache_ttl:缓存时长(默认 60 秒,可调);
- page_cache_redis:Redis 后端(需 PHP redis 扩展),未启用回退文件缓存;
- 正文渲染缓存:文章页渲染结果按内容哈希缓存,编辑自动失效;
- content_rev 内容版本号:发文章/删文/改分类后所有缓存键实时换新,TTL 可放心拉长;
- 搜索缓存:同词同页 10 分钟;浏览计数合并写:写放大降 5~20 倍。
服务器层建议
- innodb_buffer_pool_size 设为内存 1/4(如 8G 内存 → 2G);
- innodb_flush_log_at_trx_commit=2(博客可接受崩溃丢 1s,写入大幅提速);
- PHP opcache 开启(128M / 8 万文件);nginx gzip on。
诊断方法
- MySQL slow log(long_query_time=3)定位慢查询;
- php-fpm slowlog 定位 PHP 内慢点;
- EXPLAIN 检查执行计划是否走复合索引。
RyeBlogRye