问题描述
我开发了一个与 Wordpress 用户管理集成的客户端的 CRM 插件,并为 wp_usermeta
表下的每个用户存储了附加信息。
然而,客户的客户数据库呈指数级增长,现在我们已经上千,这给了 wp_usermeta
几万行:在这一点上,我开始担心这种架构的可扩展性。
有没有人管理这么多用户的 Wordpress 方法的经验?我应该向 wp_users
表添加列,而不是依靠 wp_usermeta
表吗?在现阶段我如何诊断/介绍 Wordpress 和我自己的代码性能?
我从来没有在这么多的数据上工作,而且这个数字越来越多,任何一个指针都是有价值的。
最佳解决方案
表的大小不是真正的问题,您在该表上运行的查询可能是。
例如,如果您根据存储在 user-meta 表中的数据选择用户,那么该查询将被高度未优化,因为 meta_value 不是索引字段。在这种情况下,您可能需要添加额外的索引或考虑以不同的方式存储特定数据,例如使用自定义分类法。
一般来说,您作为 meta 存储的内容不应该是您根据的专门搜索的内容。这适用于 WordPress 中的所有元表。 Meta 主要设计为由 meta_key 拉出,而不是由 meta_value 拉出。分类法将可能的值限制为一组,并以不同的方式组织信息,因此当”value” 计入您所选择的内容时,它们会更好。
注意,meta_key 和 meta_value 都是可以选择的,因为 mySQL 将首先将查询优化为基于 meta_key,从而减少搜索到 (希望) 可管理限制的数据量。如果即使这是一个问题,您可以通过在索引上使用 meta_key 和 meta_value 的元表添加新索引来 「修复」,但是由于 meta_value 是 LONGTEXT,您需要将该索引的长度限制在合理的范围内,像 20-30 或者某些东西,这取决于你的数据。请注意,该索引可能远远大于实际数据,并将大大增加所需的存储空间。但是,在这些类型的查询中,速度会更快。如果这成为一个真正的问题,请咨询合格的 DBA 。
作为参考,在 WordPress.org 上,我们有大约 1100 万用户注册。每个用户的元数量有所不同,每行最少可能有 8 行,也可能是最多约 250 行。用户表约 2.5 GB,usermeta 表约 4 GB 。似乎运行良好,在很大程度上,但每隔一段时间,我们发现一些奇怪的查询,我们必须去优化。
次佳解决方案
除非您运行自己的查询而不是使用 API,否则表的大小并不重要,因为 Wordpress 通过表的索引运行查询,而 MYSQL 应优化此类查询。每个查询也会在一个查询中获取所有元信息。
如果您坚持使用用户 ID 上的哈希表将用户元表拆分为多个表作为表名,那么您可能需要为 wp_db 类写一个替换,以便根据查询访问正确的表。如果您有兴趣遵循此路径,请寻找解决方案来处理大量网络安装与许多博客。
但是,如果您现在没有任何性能问题,那么您可以进一步增长,而不进行任何重大调整。当您开始获得性能问题时,只需将数据库移动到一个更快的服务器,这将比 WP 访问该信息的任何操作更有成本效益。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。