2010-02-22 124 views
0

查询:这个SQL查询有多危险?

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个节点
  3. 1 000 000节点

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

我需要知道我是否应该只执行此查询每隔几个小时,或者我应该把它限制为仅更新500说在一个时间等

这个地方将被执行将有几个节点网站条目,并且该查询每1个产品更新2行。所以,如果我有大量的节点,我不确定这会给服务器带来多大的压力。

+0

什么是您的RDBMS? – Lucero 2010-02-22 17:46:34

+0

我立即想到的问题是如果它被中断会发生什么...... – 2010-02-22 17:47:26

+0

Database = MySQL(我正在运行Drupal) 如果它被中断,它不是世界末日,因为它每小时运行一次。问题是,如果有1 000 000个节点,它是否会终止服务器(即使用过多的处理)?请记住,它正在更新产品,并且该网站可能有很多很多产品。 – coderama 2010-02-22 17:57:39

回答

10

我会建议在您的测试环境(您确实有一个测试环境,对吗?)进行基准测试,以估算您的服务器将会遇到的负载类型。如果不了解更多关于您的环境的信息,就很难猜测它会带来什么样的影响。

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

+0

这个,100%。每种产品的汇率都有冗余 - 即使在计算控制器的实际价格时会花费更多的时间,但您应该认真考虑将冗余数据放入新表中,因此您不必更新数百万每当汇率发生变化时,都会有产品出现。 – 2010-02-22 18:07:02

+0

如何在没有真正创建1 000 000个产品的情况下如何使用1 000 0000个产品?在drupal上? 我同意,自己测试它是最好的方法,但我不喜欢创建这么多假数据的想法。 – coderama 2010-02-22 18:24:12

+1

@RD:这不是假数据,它是测试数据。在你的测试环境中。 *你拥有哪一个,对吗?* – 2010-02-22 18:30:07

2

这无疑是一个相当沉重的呼吁。

我认为这是根据最新的货币汇率更新产品价格。 1,000,000个节点非常多,但是如果每秒有几千次点击,那么如果这是在飞行中完成的,则可能导致数百万次计算。

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

+0

这给了我一个主意。如果每次查看产品时都会更新价格?嗯。这可能会诀窍。 – coderama 2010-02-22 18:25:10

1

这是一个InnoDB或MyISAM表吗?如果使用MyISAM,它将锁定整个查询的完整表,这将锁定所有读取相当长的时间。

查询本身是可以的我认为,但请检查它与EXPLAIN以确保您有适当的索引。

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

1
c.field_product_price_zar_value = p.sell_price * 1, 

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