2010-02-22 63 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 =價格。實際上,由於您每次都要更新一次,所以我不確定查詢是否正在執行您所需要的操作。但總的來說,我絕不會考慮按計劃更新我所有的價格,除非有需要他們改變的變化。您的查詢中沒有任何內容表明發生了任何變化,因此無論貨幣價值是否發生變化(即使貨幣沒有變化,它的寫入方式也會改變值)都會發生變化。或者我沒有看到你的過程的一部分?