MYSQL / PHP: Сравнение больших наборов из 2 определенных строк в одной таблице (POKER-калькулятор)

Я пишу онлайн покер калькулятор просто для удовольствия 🙂
Я попробовал метод расчета чистого 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

Любые другие идеи приветствуются!

1

Решение

Один из способов, который стоит попробовать — позволить базе данных выполнять большую часть работы. Перенесите ваш массив во временную таблицу с первичными ключами совпадений для сравнения:

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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector