2011-11-20 71 views
0

的遞增一個值目前我有一個腳本週期超過1000萬次的記錄,這是非常緩慢的,它是這樣的: 我第一次得到1000個結果塊類似這樣的數組:在很多行

$matches[] = array('quality_rank'=>46732, 'db_id'=>5532); 
$matches[] = array('quality_rank'=>12324, 'db_id'=>1234); 
$matches[] = array('quality_rank'=>45235, 'db_id'=>8345); 
$matches[] = array('quality_rank'=>75543, 'db_id'=>2562); 

我然後通過他們循環逐一和更新記錄

$mult = count($matches)*2; 
foreach($matches as $m) 
{ 
    $rank++; 
    $score = (($m[quality_rank] + $rank)/($mult))*100; 
    $s = "UPDATE `packages_sorted` SET 
    `price_rank` = '".$rank."', 
    `deal_score` = '".$score."' 
    WHERE `db_id` = '".$m[db_id]."' LIMIT 1"; 
} 

看起來這是做的一個非常緩慢的方式,但我不能找到另一種方式來增加現場price_rank每次一個。任何人都可以提出更好的方法。

注意:儘管我通常不會在數據庫中存儲此類值,但我確實需要在此時進行比較搜索查詢。

任何幫助,將好心感謝:)

+0

「看起來這是一個非常緩慢的做法」。做什麼?這是不是很清楚你在問什麼。 – vascowhite

+0

很抱歉,如果不清楚。這很慢,因爲我需要單獨更新每個記錄(10,000,000個)。 –

+0

你試圖增加什麼?它是否是quality_rank? – vascowhite

回答

1

SQL如下。

SET @rank = 0; 
SET @mult = [your code to get # of matches]; 

UPDATE `packages_sorted` 
SET 
    `price_rank` = @rank:[email protected]+1, 
    `deal_score` = (`quality_rank` + @rank)/(@mult) * 100 
ORDER BY [ your code to get correct order of ranking here ]; 
+0

噢!看起來不錯! 我可以通過PHP運行'SET'命令嗎? –

+0

非常感謝。出於某種原因,我認爲通過一次發送一個查詢就會忘記'SET'語句。它當然可以工作,現在很快就可以了,謝謝:)大提示,我會一次又一次地使用它! –

1

對不起也許我不知道你正在嘗試做的,但你可以增加純SQL中的值,如果你這樣做:

UPDATE packages_sorted SET price_rank = (price_rank + 1) WHERE ... 
+0

啊,是的,我忘了提及。當從數據庫中選擇匹配數組時,基於另一個字段'price'排序匹配數組。還有多個字段用於選擇構成匹配的內容。最後,最初的'price_rank'將不會影響新的price_rank值,因此我不能增加它們。 –