这个SQL查询有多危险?

这个SQL查询有多危险?,sql,drupal,sql-update,drupal-nodes,server-load,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_za

查询:

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站点上的所有节点,使它们都具有最新的货币。我的问题是,如果您有:

500个节点 50000个节点 1 000 000个节点 如果该命令每小时执行一次

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


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

这无疑是一个非常重要的决定

我假设这是根据最新的货币汇率更新产品价格。1000000个节点是很多的,但是如果你每秒有几千次点击,如果这是在运行中完成的话,可能会导致数百万次计算


我唯一的建议是设置某种过滤,只更新活动产品。也就是说,对公众可见的产品。如果一个产品从非活动更改为活动,那么它应该在当时收集它的适当价格。

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


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

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

我认为查询本身是可以的,但是一定要用EXPLAIN检查它,以确保有正确的索引

也可以考虑使用VID,只更新节点的最新版本。

c.field_product_price_zar_value = p.sell_price * 1, 

这部分是浪费资源,价格*1=价格。事实上,由于您每次都按设定的数量进行更新,因此我不确定查询是否满足了您的需要。不过,一般来说,除非有一个要求他们改变的改变,否则我永远不会考虑更新我在时间表上的所有价格。查询中没有任何内容表明发生了任何更改,因此无论货币值是否更改,都会发生更改,并且即使货币没有更改,其写入方式也会更改值。或者我没有看到您的过程的一部分?

我马上想到的问题是,如果它被中断会发生什么…Database=MySQL我正在运行Drupal,如果它被中断,它不是世界末日,因为它每小时都在运行。问题是,如果有1 000 000个节点,它会杀死服务器,即使用过多的处理吗?请记住,它正在更新产品,网站可能会有很多很多产品。为什么不在需要的时候,在展示产品时,计算100%。每种产品的汇率都有冗余-即使在控制器中计算实际价格的时间稍微多一些,你应该认真考虑把多余的数据扔进一个新的表中,这样你就不必每次交换汇率时更新数百万个产品。我如何在不创建1个000个000产品的情况下对1个000个0000的产品进行类比?关于drupal?我同意,亲自测试是最好的方法,但我不喜欢创建这么多虚假数据的想法。@RD:这不是虚假数据,这是测试数据。在您的测试环境中。您有哪些记录,对吗?要创建1000000条记录:只需从节点表插入节点表,直到您有一百万条记录。@RD:在您的开发环境中执行此操作,并创建一个mysqldump,以便以后在需要时使用它进行更多测试/基准测试。事实上您可以在实现它时使用它来测试汇率表:这给了我一个想法。如果每次查看产品时,其定价都会更新怎么办?嗯,这可能会奏效。