字符串到值比较优化MySQL查询

时间:2013-02-10 23:01:25

标签: php mysql query-optimization laravel

我的问题如下: 我有两个长度相同的数组$first$second,包含字符串。每个字符串在名为Fullhandvalues的表中都给出了正值:

Field: board : string(7) PRIMARY KEY
Field: value : int (11)

我想计算$ first [$ i]的价值比$ second [$ i]多少倍,它们有多少次具有相同价值,以及$ first [$ i]多少次更糟糕价值超过$ $ [$ i]。

我现在所做的是通过

获取所有值
$values[0]= DB::table('Fullhandvalues')->where_in("board",$first)->get(Array("value"));
$values[1]= DB::table('Fullhandvalues')->where_in("board",$second)->get(Array("value"));

然后比较这些值。但这似乎非常缓慢(大约6秒,表格中的数组长度为5000和50000个条目)

非常感谢

编辑:我如何遍历它们:

$win=0;$lose=0;$tie=0;
for($i=0;$i<count($values[0]);$i++)
    {
        if ($values[0][$i]>$values[1][$i])
            $win++;
        elseif ($values[0][$i]<$values[1][$i])
            $lose++;
        else $tie++;
    }

1 个答案:

答案 0 :(得分:1)

您的问题是where_in。您基本上构建了一个长度为implode(',', $second)(加上更改)的查询。这必须首先由Laravel(PHP)生成,然后由您的DBMS进行分析。

此外,生成的查询将使用IN(...)表达式,已知该表达式在MySQL中很慢。

如果没有关于应用程序的更多信息以及如何选择棋盘ID,您可以选择以下选项:

  • 创建一个临时表并用数组数据填充(这应该非常快,但最好这些数据应该已经在数据库中)
  • 不要忘记在临时表上创建索引。
  • 选择内部join