在对数据库进行任何操作前,必须完成以下步骤,防止数据丢失。
通过织梦后台或phpMyAdmin执行备份:
登录织梦后台 -> 系统 -> 数据库备份/还原 -> 选择“全部表” -> 点击“提交”开始备份。备份文件默认保存在 /data/backupdata/ 目录下。
或使用MySQL命令行备份(将yourdbname、username、password替换为你的信息):
``` mysqldump -u username -p password yourdbname > dedecms_backup.sql ```执行以下SQL语句,了解优化前的基础性能指标:
``` SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Slow_queries'; SHOW TABLE STATUS FROM `yourdbname`; ```记录下“Threads_connected”(当前连接数)和“Slow_queries”(慢查询数量)的值,用于优化后对比。
织梦默认的MyISAM引擎和表结构在数据量增长后性能下降明显,需针对性优化。
登录phpMyAdmin,选择你的织梦数据库,对 `dede_archives` 表执行以下SQL:
``` ALTER TABLE `dede_archives` ADD INDEX `idx_sortrank` (`sortrank`), ADD INDEX `idx_pubdate` (`pubdate`), ADD INDEX `idx_typeid` (`typeid`), ADD INDEX `idx_arcrank` (`arcrank`); ```操作解释: `sortrank`(排序权重)、`pubdate`(发布时间)、`typeid`(栏目ID)、`arcrank`(审核状态)是后台列表和前台查询最常用的过滤和排序字段,为其建立索引能极大提升查询效率。
`dede_taglist` 和 `dede_keywords` 表在生成标签云和相关文章时频繁连接查询,添加联合索引:
``` ALTER TABLE `dede_taglist` ADD INDEX `idx_aid_tag` (`aid`, `tag`); ALTER TABLE `dede_keywords` ADD INDEX `idx_keyword_rank` (`keyword`, `rank`); ```对于频繁更新和写入的表(如会员表、评论表),InnoDB在并发性能和崩溃恢复上更优。转换 `dede_member` 和 `dede_feedback` 表:
``` ALTER TABLE `dede_member` ENGINE=InnoDB; ALTER TABLE `dede_feedback` ENGINE=InnoDB; ```注意: 转换前确保MySQL服务器支持并已启用InnoDB引擎。转换过程表会被锁定,请在访问量最低时进行。
编辑 `/include/dedesqli.class.php` 文件(DedeCMS V5.7及以上版本)。找到类初始化部分,在连接数据库时设置参数:
定位到类似 `$this->linkID = new mysqli(...)` 的代码行。确保连接参数后添加以下设置:
``` $this->linkID->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); $this->linkID->set_charset('utf8'); ```
同时,编辑 `/data/common.inc.php`,检查 `$cfg_db_language` 设置为 `utf8`。
在MySQL配置文件 `my.cnf` 或 `my.ini` 的 `[mysqld]` 段落下添加:
``` slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 1 ```修改后重启MySQL服务。运行一段时间后,分析慢日志文件,使用 `mysqldumpslow` 工具:
``` mysqldumpslow -t 10 /var/log/mysql/slow.log ```输出结果会显示最耗时的10个SQL语句,针对这些语句进行优化。
织梦部分原生查询可能效率不高,例如在循环中执行查询。可以修改核心文件来合并查询。
例如,在需要批量获取文章信息的场景,避免在循环内调用 `GetOneArchive`。应改为先一次性获取所有ID,再用 `WHERE id IN (...)` 的方式查询。这需要根据具体二次开发代码调整。
登录后台 -> 系统 -> 系统基本参数 -> 性能选项:
在MySQL配置文件中添加:
``` query_cache_type = 1 query_cache_size = 64M query_cache_limit = 2M ```注意: MySQL 8.0已移除查询缓存功能。此条仅适用于旧版本。
建立计划任务(Crontab),定期运行以下清理SQL:
``` -- 删除30天前的未审核评论 DELETE FROM `dede_feedback` WHERE `ischeck`=0 AND `dtime` < DATE_SUB(NOW(), INTERVAL 30 DAY); -- 清理过期会员登录错误记录 DELETE FROM `dede_member_login` WHERE `logintime` < DATE_SUB(NOW(), INTERVAL 7 DAY); -- 优化所有表(释放删除数据后的碎片空间) mysqlcheck -o -u username -p password yourdbname ```对于访问量非常大的站点,考虑读写分离。修改织梦的数据库连接类 `/include/dedesqli.class.php`,使其能够根据SQL类型(SELECT/INSERT/UPDATE/DELETE)选择连接主库或从库。这需要较强的PHP和MySQL配置能力,通常需要二次开发实现。
安装Memcached或Redis扩展,并修改织梦缓存机制。编辑 `/include/cache.class.php`,将默认的文件缓存驱动替换为Memcached驱动。需要重写 `Cache` 类中的 `get`、`set`、`delete` 方法,使其调用Memcached或Redis的API。
将以下命令加入每日巡检脚本,监控数据库健康状态:
``` mysqladmin -u username -p password status mysql -u username -p password -e "SHOW PROCESSLIST;" | grep -v Sleep ```第一行查看整体状态(Uptime, Threads, Questions等)。第二行查看当前非休眠的活动连接,有助于发现异常长查询。
完成以上所有优化步骤后,再次执行第一章的 `SHOW STATUS` 命令,对比“Slow_queries”等指标的变化。优化是一个持续的过程,建议在每次重大更新或流量增长后,重新分析慢查询日志并调整索引策略。
下一篇: 织梦天气标签调用,让网站自带天气预报功能
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图