如果您的插件将包含大量数据,那么使用wp_postmeta
不是一个好主意,如下所示:
以WooCommerce为例,在一个拥有约30000种产品的商店中,每个产品平均会有约40个post meta(属性和所有内容),每个产品有5个产品图像,这意味着每个图像将有约4个图像元:
30000个产品x 40个meta每个=1200000行wp_postmeta
+
30000个产品x每个5个图像x每个4个图像元=600000行wp_postmeta
因此,仅使用30000种产品,您就可以看到1800000行wp_postmeta
.
如果您为产品或产品图像添加更多属性,此数字将成倍增加。
这有两个问题:
MySQL的自连接非常昂贵wp_postmeta
除非您使用的是更高版本的mysql(即没有全文索引meta_value
)从实际案例中给出一个示例:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE \'_shipping_city\'
这将从所有订单详细信息中选择发货城市
comes at a whopping ~3 seconds on an entry level dedicated server even if there are 5-10 orders. 这是因为查询是从
wp_postmeta
在带电安装中约有300万行的表。
甚至主页也很慢,因为主题从wp_postmeta
- 滑块,一些评论插入,一些其他元。一般来说,产品列表非常慢,在列出产品时,搜索速度也同样慢。
您无法通过任何正常方式修复此问题。您可以在服务器中使用弹性搜索,并在Wordpress中使用弹性搜索插件,您可以使用redis/memcached,您可以使用良好的页面缓存插件,但最终基本问题仍然存在——从臃肿的wp_postmeta
无论何时完成,桌子都会很慢。在我测试下面实现的解决方案的服务器上,所有这些都已正确安装和配置并进行了优化,自缓存插件启动以来,对于未登录的用户或通常进行的查询,站点运行良好。
但是,当登录用户尝试做一些通常不做的事情,或者cron、缓存插件或任何其他实用程序想要从db获取实际数据以缓存它或做其他事情时,事情就变得非常缓慢。
所以我尝试了其他方法:
我编写了一个小插件,以获取所有产品元(Posteta为post类型product) 到由代码生成的自定义表。这个插件为每个帖子获取所有元,并通过将每个元添加为列并将值插入到每一行来创建一个表。我将EAV格式转换为水平、扁平的关系格式。我还有一个插件,可以从wp_postmeta
桌子
当我这么做的时候,我搬家了attachment Posteta和所有其他post类型的meta都将添加到自己的表中。
然后我迷上了get_(post_type)_meta
筛选以覆盖元数据的检索,从而从新的自定义表中为元数据提供服务。
现在,来自早期的同一个查询,从中提取大约需要3秒钟wp_postmeta
大约需要0.006秒。该站点现在的行为就像是一个新的WP安装。
....................
当然,用Wordpress的方式做事更好。这实际上是常态。
However, 很明显,EAV表在扩展方面效率很低。它具有无限的灵活性,允许您存储任何数据,但您为此付出的代价是性能。这是一个基本的权衡。
在这种情况下,很难告诉某人谁打算拥有一大堆数据,并且——但愿如此——查询/搜索要使用的数据wp_postmeta
当然是表。这次演出一定会很精彩。
使用自定义表将允许您的数据堆积起来,并且仍然保持足够快的速度。
就像Pippin Williams,Easy Digital Downloads插件的创建者提到的那样,如果他刚开始编写插件,他会使用自定义表。如果你要创建一些可以长期使用或积累大量数据的东西,如果你设计得好,使用自定义表会更有效。
您必须确保任何其他插件/加载项开发人员都有方法连接到您的插件中,以便在检索数据之前和之后操作您的数据。如果你这样做,那么你就相当可靠了。