0

クエリ:

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 を更新して、すべて最新の通貨にします。私の質問は、次の場合、このクエリはどれほど危険かということです。

  1. 500ノード
  2. 50,000 ノード
  3. 1 000 000 ノード

このコマンドを 1 時間ごとに実行しますか?

このクエリを数時間ごとに実行するだけにするか、一度に 500 などの更新のみに制限するかを知る必要があります。

これが実行されるサイトには複数のノード エントリがあり、このクエリは 1 つの製品ごとに 2 行を更新します。したがって、大量のノードがある場合、これがサーバーにどれほど負担をかけるかはわかりません。

4

4 に答える 4

10

テスト環境 (テスト環境はありますよね?) でこれをベンチマークして、サーバーが受ける負荷の種類を概算することをお勧めします。環境について詳しく知らずに、これがどのような影響を与えるかを推測することは非常に困難です。

ただし、アプリケーションを改善するには、為替レートを別のテーブルに保存し、ユーザーが特定の製品をプルしたときに計算することをお勧めします。このようにして、実際に変更されたのはほんの一握りの数値だけである場合に、何百万もの行を更新する必要はありません。必要に応じて、1 時間ごとではなく、数分ごとに為替レートを更新することもできます。

于 2010-02-22T18:03:51.287 に答える
2

これは間違いなく、非常に大きな要求です。

これは、最新の為替レートに合わせて製品価格を更新するためだと思います。1,000,000 ノードは大量ですが、1 秒あたり数千のヒットがある場合、これをその場で行うと数百万の計算になる可能性があります。

私の唯一の推奨事項は、「アクティブな」製品のみを更新するように何らかのフィルタリングを設定することです。つまり、一般に公開されている製品です。製品が非アクティブからアクティブに変化した場合、その時点で適切な価格を収集する必要があります。

于 2010-02-22T18:03:14.920 に答える
1

これは InnoDB または MyISAM テーブルですか? MyISAM の場合、クエリ全体の完全なテーブルがロックされ、かなりの時間すべての読み取りがロックアウトされます。

クエリ自体は問題ないと思いますが、EXPLAIN でチェックして、適切なインデックスがあることを確認してください。

の使用を検討しvid、ノードの最新リビジョンのみを更新することもできます。

于 2010-02-22T18:05:40.200 に答える
1
c.field_product_price_zar_value = p.sell_price * 1, 

うーん、この部分は資源の無駄遣いで、値段×1=値段。実際、毎回一定量ずつ更新しているため、クエリが必要なことを行っているかどうかはわかりません。ただし、一般的には、変更が必要な変更がない限り、スケジュールにあるすべての価格を更新することは考えません. 変更が発生したことを示すクエリには何もないため、通貨の値が変更されたかどうかに関係なく発生します(通貨が変更されていなくても、記述方法によって値が変更されます)。または、私はあなたのプロセスの一部を見ていませんか?

于 2010-02-22T18:12:38.843 に答える