簡體   English   中英

執行此UPDATE查詢的最佳方法

[英]Best way to do this UPDATE query

我必須對80萬行進行更新查詢,並尋找執行此操作的最佳方法。 除了一個字段(在我的示例中為D)以外,所有行均以相同的值更新。 該字段可以是1或0。我使用Zend_Db的update()方法。 我認為有3種方法可以做到這一點:

  • 方法1:更新每一行,一個接一個地更新(帶有foreach)。

  • 方法2:在更新中執行IF以設置字段的值

  • 方法3:將行分為兩組(一組字段= 1,另一組字段= 0)並進行兩次更新(UPDATE ... WHERE ID IN(...)),每組更新一次。

查詢看起來像這樣:

$a_data = array(
  'A' => foo,
  'B' => 99,
  'C' => 0,
  'D' => (0 OR 1 ?)
);

$where['id IN (?)'] = $a_id;
$update = $this->_db->update($this->_name, $a_data, $where);

巫婆方法可以做到這一點的最好方法嗎? 謝謝

據記錄,在實時生產服務器上更新80萬行不是一個好的計划。 除了在實際的mysql級別上進行之外,此更新停止服務器的幾率很高。

話雖如此,假設您正在運行MySql,

如果您僅擁有800k行=> 800k查詢,那么方法1.是不可行的。 php.ini中的max_timeout不允許腳本運行那么長時間。 如果仍要嘗試,請嘗試將結果拼接成50-100-200的批次(取決於您的服務器配置),然后運行每個批次並在它們之間存在時間差。 做一批,等一下,做一批,等一下,依此類推...

方法2。我認為它與您的特定問題有關,但是會更快。

方法3。請參閱方法1的答案,但不是一次即可獲得800k,而是取決於0與1之間的比率。 這將是兩個非常大的查詢。

通常,當有這樣的大批量更新時,我會說,從命令行使用mysql。 如果這是您正在運行的更新php腳本,則最好的結果是拼接結果並一次更新50-100(無論多少)。 盡管這很耗時(一次800.000行/ 100行=腳本運行800次+每批更新后暫停一秒鍾)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM