Я пишу онлайн покер калькулятор просто для удовольствия 🙂
Я попробовал метод расчета чистого php, чтобы сравнить две руки, он вычисляет результат для каждой возможной колоды (C (5,48) = 1712304 колоды)
Это занимает около 12 секунд на моем отстойном сервере one.com: D Что, конечно, слишком медленно, если я когда-нибудь выложу его в Интернет для публики.
Поэтому я попробовал новый подход, базы данных, я сохранил все комбинации для 7 карт (рука + колода) в базе данных. Итак, у меня есть база данных из 5 ГБ более 130 миллионов строк с первичным ключом (представление колоды в двоичном формате) и points or rank
из этих 7 карт.
Так скажем, столбцы называются a
а также b
, где a
является первичным ключом.
Теперь я хочу / нужно сравнить b
где (a
= х) и (a
= у)
но снова в худшем случае для: C (5,48).
Так, например, в плохо написанном коде:
$ar = array(array(1,4),array(53,422),array(4423423,472323),array(71313,13131));
for ($i = 0; $i < count($ar);$i++)
{
$value_one = mysql_fetch_assoc(mysql_query('select `b` from `hugetable` where (`a` = ' . $ar[$i][0] ' . LIMIT 1;'))['b'];
$value_two = mysql_fetch_assoc(mysql_query('select `b` from `hugetable` where (`a` = ' . $ar[$i][1] ' . LIMIT 1;'))['b'];
if ($value_one > $value_two)
$win++;
elseif ($value_one < $value_two)
$lose++;
else
$draw++;
}
Вопрос в том, есть ли более быстрый путь?
Также есть прямой способ сделать это и получить выигрыш за столом win
draw
loss
немедленно вернуться?
Вся помощь и ответы приветствуются !!! 🙂
РЕДАКТИРОВАТЬ:
Этот подход явно не сработал очень хорошо, ха-ха: D
это заняло около 100 секунд: D
Любые другие идеи приветствуются!
Один из способов, который стоит попробовать — позволить базе данных выполнять большую часть работы. Перенесите ваш массив во временную таблицу с первичными ключами совпадений для сравнения:
create temporary table match_list (int pk1, int pk2);
Теперь вы можете запросить большую таблицу для статистики выигрышей / проигрышей / ничьих:
select sum(case when t1.score > t2.score then 1 end) as wins
, sum(case when t1.score < t2.score then 1 end) as losses
, sum(case when t1.score = t2.score then 1 end) as draws
from match_list
join match_results t1 force index (pk_match_results)
on t1.pk = match_list.pk1
join match_results t2 force index (pk_match_results)
on t2.pk = match_list.pk2
Я добавил force index
намек что может помочь для сравнительно небольшого числа поисков на очень большой таблице. Вы можете найти имя для индекса, используя show index from mytable
,
Других решений пока нет …