问题描述
希望对 WordPress 数据库中优化和保持最佳性能的一些反馈,以绘制图片…. 让我们说你有一个 WordPress /Buddypress MU 网站,开始在大约 150kb(香草安装) … 随着时间的推移,用户添加博客,论坛,帖子和评论,数据库增长到 5mb …. 然后是明年的 10mb …. 还假设主机控件是标准的共同设置,如 Cpanel 或 Plesk 。
-
数据库中的条目数量会影响 front-end 网站的性能?
-
作为网站管理员,您可以做些什么,以便随着数据库的增长而保持运行顺畅?
-
你的数据库在 500 – 600mb 大之后,在第 5 年后的表现可以期待什么?
感谢您对保持紧密船舶的任何反馈。
问候,
S.
最佳解决方案
您的具体问题:
1) 在性能受影响之前,DB 可能包含的 「条目数」 没有严格的限制。性能取决于您的硬件和配置,就像在 DB 的大小和结构上一样。
2) 如果您担心数据库层的可扩展性,可以在集群中或在允许调整大小的云端框或 VPS 上运行它。如果您的数据库开始缓慢,您可以调整大小 (通常是额外的费用) 。这些选项增加了成本,但确实是确保 DB 的可扩展性的最佳方式。
3) 这取决于你的主机设置和你的数据库架构。但一般来说 (除非你是一个非常便宜的盒子),我不用担心一个 30MB 的 WordPress 数据库。 WordPress 做好索引表的工作,甚至一个 OOB MySQL 配置也可以轻松处理这个大小的 DB 上的 WordPress 查询。当您达到千兆字节时 – 那就是您可能需要认真考虑性能优化选项。
一般来说:
如果您担心性能问题,请专注于调整现有的 MySQL 设置和/或设置缓存层。缓存可以大大减轻 MySQL 的负担 (特别是对于 WordPress 站点,因为它们通常执行大量的数据库查询) 。
如果您已经正确调整 MySQL 并设置了一个体面的缓存层,那么您仍然担心会出现硬件配置问题,您可以在 x 时间之后设置删除内容的策略。
这些东西都不是特定于 WordPress 的。而且我不确定该问题有什么答案不适用于在 LAMP 堆栈上运行的任何网站或应用程序。但也许有人有关于 MU 表结构或其他 WP-specific DB 技巧的建议… 我不知道。
次佳解决方案
严格来说,从 MySQL Point-of-View,我有建议如何改进 MySQL 实例数据/索引的缓存。
请记住,MySQL 有两个主要的存储引擎
-
MyISAM 数据
-
InnoDB 的
他们的缓存机制是不同的。有一些你可以做的,以调整您选择的存储引擎。
MyISAM
MyISAM 只缓存索引页。它从不缓存数据。您可以做两件事来改善 MyISAM 表的 I /O 。
MyISAM 改进#1
具有 VARCHAR 列的任何 MyISAM 表都可以内部转换为 CHAR 而不用触摸初始设计。假设你有一个名为 mydb.mytable 的表,并且您希望改进它的 I /O,请执行以下操作:
ALTER TABLE mydb.mytable ROW_FORMAT=Fixed;
这将增加表 60%-100%的大小,但是在不改变任何东西的情况下,I /O 的性能将会提高 20-30%。我之前在 DBA StackExchange 中写过这个:
MyISAM 改进#2
您需要增加 MyISAM 密钥缓存 (按照 key_buffer_size 的大小) 。请运行此查询:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql','performance_schema')) AA ) A,
(SELECT 2 PowerOf1024) B;
这将显示您基于您当前数据集的理想 key_buffer_size 。
InnoDB
InnoDB 缓存数据和索引。如果您将所有数据转换为 InnoDB,并且目前正在从所有 InnoDB 数据库运行 WordPress,则需要将 InnoDB 缓冲池 (使用 innodb_buffer_pool_size 调整大小) 。请运行此查询:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
这将显示您基于您当前数据集的理想 key_buffer_size 。
Projections
如果您预计数据集将增长 20 倍,则只有多个此查询建议的建议 20 。假设您的 MyISAM 数据集是 15MB,3MB 是索引的总和。如果您估计有 20 倍的数据,请将 key_buffer_size 设置为 60MB,如/etc/my.cnf 所示:
[mysqld]
key_buffer_size=60M
然后重新启动 MySQL 。同样的事情将适用于 InnoDB 缓冲池。
如果您的所有数据都是 InnoDB,则需要对 StackOverflow 中发布的 InnoDB 基础架构执行完整的清理。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。