0

查询:

UPDATE 
  node as n
    right join content_type_product as c 
    on n.nid = c.nid 

    right join uc_products as p 
    on p.nid = n.nid 

    set 
       c.field_product_price_eur_value = p.sell_price * 0.0961, 
       c.field_product_price_zar_value = p.sell_price * 1, 
       c.field_product_price_gbp_value = p.sell_price * 0.0844, 
       c.field_product_price_usd_value = p.sell_price * 0.1305, 
       n.changed = now() 
    where n.type = 'product'

对于那些还没有弄清楚的人,这个查询会更新 Drupal 站点上的所有节点,以使它们都具有最新的货币。我的问题是,如果你有这个查询有多危险:

  1. 500 个节点
  2. 50 000 个节点
  3. 1 000 000 个节点

如果这个命令每小时执行一次?

我需要知道我是否应该只每隔几个小时执行一次这个查询,或者我是否应该将它限制为一次只更新 500 个等。

将执行此操作的站点将具有多个节点条目,并且此查询为每 1 个产品更新 2 行。所以,如果我有大量节点,我不确定这会对服务器造成多大的压力。

4

4 回答 4

10

我建议在您的测试环境中对此进行基准测试(您确实有一个测试环境,对吗?)以估计您的服务器会遇到什么样的负载。如果不进一步了解您的环境,很难猜测这会产生什么样的影响。

但是,为了改进您的应用程序,我建议将汇率存储在单独的表中,并在用户提取特定产品时计算它们。这样,当只有少数数字实际发生变化时,您不必更新数百万行。如果需要,您甚至可以每隔几分钟而不是每小时更新一次汇率。

于 2010-02-22T18:03:51.287 回答
2

毫无疑问,这是一个非常重要的呼吁。

我假设这是根据最新的货币汇率更新产品价格。1,000,000 个节点很多,但如果您每秒有数千次点击,那么如果动态完成,可能会导致数百万次计算。

我唯一的建议是设置某种过滤来仅更新“活动”产品。也就是说,公众可以看到的产品。如果产品从非活动状态变为活动状态,它应该在那时收集适当的价格。

于 2010-02-22T18:03:14.920 回答
1

这是 InnoDB 还是 MyISAM 表?如果是 MyISAM,它将锁定整个查询的完整表,这将在相当长的时间内锁定所有读取。

我认为查询本身没问题,但请使用 EXPLAIN 检查它以确保您拥有正确的索引。

您还可以考虑使用vid,并且仅更新节点的最新版本。

于 2010-02-22T18:05:40.200 回答
1
c.field_product_price_zar_value = p.sell_price * 1, 

那么这部分是资源的浪费,价格*1=价格。实际上,由于您每次都更新了一定数量,因此我不确定查询是否在执行您需要的操作。但总的来说,我永远不会考虑按计划更新我拥有的所有价格,除非有变化需要它们改变。您的查询中没有任何内容表明发生了任何变化,因此无论货币价值是否发生变化都会发生(即使货币没有变化,它的写入方式也会改变价值)。还是我没有看到您的流程的一部分?

于 2010-02-22T18:12:38.843 回答