查询:
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站点上的所有NODES更新为所有具有最新货币的NODES。我的问题是,如果您有以下内容,此查询有多危险:
如果每小时执行一次此命令?
我需要知道我是否应该每隔几个小时执行一次这个查询,或者我是否应该将其限制为一次只更新500个等等。
将执行此操作的站点将具有多个节点条目,并且此查询为每1个产品更新了2行。所以,如果我有大量的节点,我不确定这会给服务器带来多大的压力。
答案 0 :(得分:10)
我建议在您的测试环境中对此进行基准测试(您确实有一个测试环境,对吧?)来估算服务器会遇到的负载类型。如果不了解您的环境,就很难猜出会产生什么样的影响。
但是,为了改善您的应用程序,我建议将汇率存储在单独的表中,并在用户提取特定产品时进行计算。这样,当只有少量数字实际更改时,您不必更新数百万行。如果需要,您甚至可以每隔几分钟而不是每小时更新一次汇率。
答案 1 :(得分:2)
毫无疑问,这是一个非常沉重的呼吁。
我认为这是根据最新的货币汇率更新产品价格。 1,000,000个节点很多但是如果你每秒有几千个点击,如果这是在运行中就可以产生数百万次计算。
我唯一的建议是设置某种过滤以仅更新“有效”产品。也就是说,公众可以看到的产品。如果产品从非活动状态变为活动状态,那么它应该在那时收集适当的价格。
答案 2 :(得分:1)
这是InnoDB还是MyISAM表?如果是MyISAM,它将锁定整个查询的完整表,这将在相当长的时间内锁定所有读取。
我认为查询本身是正常的,但请使用EXPLAIN进行检查以确保您拥有正确的索引。
您还可以考虑使用vid
,并仅更新节点的最新版本。
答案 3 :(得分:1)
c.field_product_price_zar_value = p.sell_price * 1,
那么这部分是浪费资源,价格* 1 =价格。事实上,由于您每次都按设定数量进行更新,因此我不确定查询是否正在执行您所需要的操作。一般来说,除非有变更要求他们改变,否则我永远不会考虑按时间表更新我的所有价格。您的查询中没有任何内容表明任何更改已经发生,因此无论货币值是否发生变化(以及即使货币未发生变化,其写入方式也会更改值)都会发生。或者我没有看到你的过程的一部分?