MYSQL/PHP:在一个 table 中比较 2 个特定行的大集合(POKER 计算器)
MYSQL/PHP: Comparing large sets of 2 specific rows in one table (POKER-calculator)
我正在编写一个在线扑克计算器只是为了好玩:)
我尝试了纯 php 计算方法,为了比较两只手,它计算了每副可能牌组的结果(C(5,48) = 1712304 牌组)
在我糟糕的 one.com 服务器上,这需要大约 12 秒 :D 如果我将它放在网上 public,那当然太慢了。
所以我尝试了一种新方法,数据库,我将 7 张牌(手牌 + 牌组)的所有组合存储在数据库中。所以我有一个超过 1.3 亿行的 5gb 数据库,其中包含一个主键(二进制表示形式的牌组)和那 7 张牌的 points or rank
。
所以假设这些列称为 a
和 b
,其中 a
是主键。
我现在 want/need 比较 b
其中 (a
= x) 和 (a
= y)
但又是最坏的情况: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++;
}
那么问题来了,有没有更快的方法呢?
还有一种直接的方法可以做到这一点并立即获得 table 胜利 win
draw
loss
吗?
欢迎所有的帮助和回答!!! :)
编辑:
这种方法显然效果不佳哈哈:D
花了大约 100 秒 :D
欢迎任何其他想法!
一种值得尝试的方法是让数据库完成大部分工作。将您的数组转移到一个临时 table 与匹配的主键进行比较:
create temporary table match_list (int pk1, int pk2);
现在您可以查询更大的 table 以获得 win/loss/draw 统计信息:
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
hint,这可能有助于相对少量的查找到非常大的 table。您可以使用 show index from mytable
.
找到索引的名称
我正在编写一个在线扑克计算器只是为了好玩:)
我尝试了纯 php 计算方法,为了比较两只手,它计算了每副可能牌组的结果(C(5,48) = 1712304 牌组)
在我糟糕的 one.com 服务器上,这需要大约 12 秒 :D 如果我将它放在网上 public,那当然太慢了。
所以我尝试了一种新方法,数据库,我将 7 张牌(手牌 + 牌组)的所有组合存储在数据库中。所以我有一个超过 1.3 亿行的 5gb 数据库,其中包含一个主键(二进制表示形式的牌组)和那 7 张牌的 points or rank
。
所以假设这些列称为 a
和 b
,其中 a
是主键。
我现在 want/need 比较 b
其中 (a
= x) 和 (a
= y)
但又是最坏的情况: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++;
}
那么问题来了,有没有更快的方法呢?
还有一种直接的方法可以做到这一点并立即获得 table 胜利 win
draw
loss
吗?
欢迎所有的帮助和回答!!! :)
编辑: 这种方法显然效果不佳哈哈:D 花了大约 100 秒 :D
欢迎任何其他想法!
一种值得尝试的方法是让数据库完成大部分工作。将您的数组转移到一个临时 table 与匹配的主键进行比较:
create temporary table match_list (int pk1, int pk2);
现在您可以查询更大的 table 以获得 win/loss/draw 统计信息:
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
hint,这可能有助于相对少量的查找到非常大的 table。您可以使用 show index from mytable
.