Shopware 6 如何提高后台订单搜索的性能?

Shopware 6 How to improve Performance of the Order Search in the Backend?

我正在使用 Shopware 6.4.6.1

我大约有 300 万。数据库中的订单和客户。

当我使用后端搜索特定订单号时,系统对数据库发出非常复杂的查询,该查询太慢而无法及时响应,所以我超时了。这样就无法使用后台找单了。数据库在查询中使用的表上没有任何索引,我觉得很奇怪。

据我了解,elasticsearch集群只是用来做商品,类目之类的,不是用来找订单和客户的。

SW6 中以高效方式查找特定订单/客户并处理数百万个订单/客户的一般概念是什么?

这里没有代码,只是一个笼统的答案。

最好的解决方案是设置一个 Elasticsearch 集群(或为此设置完整的 ELK 堆栈)。为此,您需要一个自定义索引器(告诉 Shopware 您需要 Elastic 中的哪些字段),以及 decorate/extend Core ApiControllers 的 search() 方法,如下所示:

if (in_array($entityName,['order','customer'])) {
  $context->addState(Context::STATE_ELASTICSEARCH_AWARE);
}

我们对 Shopware 6 进行了自定义扩展,并向 Elsaticsearch 添加了客户和订单数据,因此这使得搜索非常迅速和快速。就像 SW6 中的产品搜索一样。

一个不太有前途的解决方案是将适当的数据库索引添加到 MySQL。这使我的订单搜索速度提高了大约 30-40%。我无法理解为什么 Shopware 首先在没有索引的情况下运送其数据库,也许这与 re-build 写入索引的必要性有关,这会消耗相当多的内存。不知道。应该查看所有涉及的 table 的索引。

总的来说,我认为他们在所有后端搜索方面做得非常糟糕,导致其中许多搜索无法使用,尤其是当您有大量数据时。大概是SW6最失望的事情了...

在我们旧的 SW6 之前的平台中,由于巨大的 tables,我们也遇到了严重的性能问题。那里的解决方案是向数据库添加一个额外的 order_lookup table,只有最少的一组列(主要是连接的字符串,只有客户支持真正搜索的字段)。此 table 已优化索引,每次添加或编辑新订单时都会使用 MySQL 触发器将数据写入其中。在后端,一个定制的搜索页面查询了 order_lookup table。如果 Elasticsearch 不适合你,你可以在 SW6 中做类似的事情。