Как я могу улучшить этот PHP MySQL в ранг поколение?


Как я могу улучшить этот PHP MySQL в ранг поколение?
(В основном ищу, чтобы улучшить скорость, но любая обратная связь очень приветствуется)

Сейчас я продолжаю статистика и ранги в 2 отдельные таблицы. Единственная проблема с этим-я не знаю как объединить Select и Update запросы, чтобы, возможно, увеличить скорость резания при обработке РНР результатов и обновления из него. Также эта функция является очень трудоемким. Она занимает около 5-10 минут, чтобы обработать 300,000+ рангов. Это не очень плохо, но мне нужно сделать это 50+ раз. Мне нравится, как он не закрою свои базы данных, потому что получение рядах занимает всего несколько секунд, и все обновления делаются индивидуально, что не оставляет места для других запросов на процесс, а не замок за 5-10 минут каждый раз.

function get_ranking($rank, $rank_order, $DBH, $test_mode=true)
{
    $test_mode == true ? $limter = ' LIMIT 50' : $limter = ''; 

    $query0 = 'SET @rank=0';
    $query1 = 'SELECT @rank:=@rank+1 AS rank, player_id FROM player_stats ORDER BY '.$rank_order.$limter;

    try
    {
        $DBH->exec($query0); 
        $qh = $DBH->prepare($query1);
        $qh->setFetchMode(PDO::FETCH_ASSOC);

        if ($qh->execute()) 
        {
            while ($result = $qh->fetch())
            {
                $query2 = 'UPDATE `player_ranks` SET '.$rank.' = \''.$result['rank'].'\' WHERE `player_id` =\''.$result['player_id'].'\'';

                $qh2 = $DBH->prepare($query2);
                $qh2->execute();
            }

            return true; 
        } 

        return false; 
    } 
    catch (PDOException $e) 
    {
        save_PDO_error_to_file($e);
        return false;
    }   
}

Спасибо за любые советы/отзывы/помогите!



1889
4
задан 16 мая 2011 в 02:05 Источник Поделиться
Комментарии
2 ответа

То, что вы можете попробовать, держит все внутри базы данных. С помощью выбора, создать временную таблицу:

CREATE TEMPORARY TABLE tmp_ranks (rank int auto_increment primary key, player_id int)
AS SELECT NULL AS rank, player_id AS player_id FROM player_stats
ORDER BY '.$rank_order.$limter

Это должно дать вам таблицу, которая выглядит как

| rank | player_id |
+------+-----------+
| 1 | 123456789 |
| 2 | 123456780 |

Теперь, используя обновление с присоединиться, обновите player_ranks таблице:

UPDATE player_ranks, tmp_ranks SET player_ranks.$rank = tmp_ranks.rank
WHERE player_ranks.player_id = tmp_ranks.player_id;

Это должно работать достаточно быстро, но учитывая ваш размер данных, может занять некоторое время. Я бы предложил тестирование на непроизводственные коробки во-первых, в случае, если он блокирует вещи какое-то время.

Обратите внимание, что я оставил свой PHP-переменные встроенные, так что вы должны исправить это.

3
ответ дан 19 мая 2011 в 01:05 Источник Поделиться

Похоже, вы просто заказ player_stats некоторые перешли в колонку и затем через нумерации в результате, начиная с 1. Это может быть проще забыть хранения явные ранг в вашей БД, и вместо того, чтобы реализовать нумерацию на вид слой.

1
ответ дан 16 мая 2011 в 01:05 Источник Поделиться