这个SQL查询有多危险?

时间:2010-02-22 17:44:32

标签: sql drupal sql-update drupal-nodes server-load

查询:

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。我的问题是,如果您有以下内容,此查询有多危险:

  1. 500个节点
  2. 50 000个节点
  3. 1 000 000个节点
  4. 如果每小时执行一次此命令?

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

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

4 个答案:

答案 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 =价格。事实上,由于您每次都按设定数量进行更新,因此我不确定查询是否正在执行您所需要的操作。一般来说,除非有变更要求他们改变,否则我永远不会考虑按时间表更新我的所有价格。您的查询中没有任何内容表明任何更改已经发生,因此无论货币值是否发生变化(以及即使货币未发生变化,其写入方式也会更改值)都会发生。或者我没有看到你的过程的一部分?