2012-07-03 5 views
1

Я работаю над проектом, который до сих пор имеет 7000 + строк данных таблицы лидеров, который содержит имя, идентификатор, оценку и рейтинг. Он постоянно расширяется, и я в настоящее время попал в ловушку, в которой сервер время от времени, пытаясь обновить все каждый раз, когда кто-то публикует новый балл.Самый эффективный способ обновления 1000 строк с помощью mySQL?

В настоящее время я использую PDO с запросом в сочетании с вызовом looped execute(). Есть ли более быстрый способ сделать это (возможно, в одном запросе mySQL)? В качестве альтернативы, есть ли у вас какие-либо предложения по обработке обновленной таблицы лидеров?

$stmt = $dbh->prepare("SELECT * FROM high_scores ORDER BY score DESC"); 
    $stmt->execute(); 

    $stmt->setFetchMode(PDO::FETCH_ASSOC); 
    $results = $stmt->fetchAll(); 

    // 

    $numItems = count($results); 

    // is this OK or a no-no? 

    try { 

     $stmt = $dbh->prepare("UPDATE high_scores SET rank = :rank WHERE uid = :uid"); 

     for($i=0; $i<$numItems; $i++){ 
      $rank = $i + 1; 
      $uid = $results[$i]['uid']; 
      $stmt->execute(array(':rank' => $rank, ':uid' => $uid)); 
     } 

     return true; 

    } catch (PDOException $e) { 
     echo($e->getMessage()); 
    } 

ответ

1

Зачем вам хранить рейтинг? Это форма денормализации, вам это действительно нужно или вы выполнили этот шаг, потому что ожидалось, что это будет необходимо?

Смотрите, например это решение:

http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/

Может быть, попробовать, как это работает?

Также, если вы видите пример, который он сделал, вы можете использовать переменную в запросе. Это также позволит вам для этого оператора обновления объединить его в одном запросе. Запрос в цикле является сложным, вряд ли даже будет действительно эффективным.

+0

Это была отличная помощь, спасибо. – maskedbacon

0

Я думаю, что вы можете сделать все это с одним запросом, что-то вроде

UPDATE high_scores a SET rank = (SELECT count(uid) + 1 FROM high_scores b WHERE b.score > a.score) ORDER BY score DESC 

у меня нет MySQL доступны прямо сейчас, чтобы попробовать это, к сожалению, так что если это оказывается не быть практически возможным, я удалю это.

0

Быстрое google mysql's 'CASE'.

Вы, скорее всего, найти ответ, хотя здесь: Stackoverflow #9346755

По сути, у вас есть один SQL строки, которая имеет свой собственный «внутренний переключатель-оператор». Вам просто нужно сказать, что делать, когда определенное поле имеет определенное значение. НАПРИМЕР. в приведенной выше ссылке, говорится.

When `id` is 1, then set the value to 12. 
When `id` is 2, then set the value to 42. 
etc. 

Ваша единственная проблема может быть связана с 7000+ строками.

Но, используя PHP, у меня были бы данные в массиве, а затем с использованием array_slice(), получить 200/300 записей за один раз, настроить SQL-строку и выполнить. Затем получите следующие 200/300 записи и повторите, пока не достигнет конца массива PHP.

Edit: Имейте в виду, однако, выше, будет работать только тогда, когда вы обновляете одно поле, основываясь на другом поле (например, ключом).

Смежные вопросы