从一张桌子中选择超过10,000次

时间:2016-08-21 13:05:57

标签: php mysql

我有表arseh,所有字段都是主键。所有字段都有索引。它有10,000,000记录。

         Arseh Table
------------------------------
|Code|ID|FromYear|ToYear|
-----------------------------
|1   |1 |1350    |1395  |
|2   |1 |1355    |1366  |
|2   |10|1395    |1395  |

PHP

function Calc($Code,$ID,$FromYear,$ToYear){
    $Handler = new DB();
    $Result=$Handler->query("select * from arseh where Code='".$Code."' and ID=".$ID." and FromYear='".$FromYear."' and ToYear='".$ToYear."'");
    return $Result;
}

我需要使用不同的随机参数调用函数Calc超过10,000次。

问题:此方案(调用Calc 10,000次)需要20秒才能完成。怎么能减少这个时间?

如果我将表格的整个数据一次插入数组而其他时间在数组中搜索而不是从表中选择更好?或者不是?

2 个答案:

答案 0 :(得分:1)

您可以预测所需数据并在查询时加载更小的数据。 但另一种方法是我在这里描述的索引搜索:

首先加载所有数据并将其保存在全局变量中。

然后为FromYear创建一个数组,同时将其索引设置为FromYear值,将另一个数组设置为ToYear,同时将其索引设置为ToYear,并将两个值设置为数据索引。

然后根据索引和您的需要过滤ToYear和FromYear数组。

然后交叉结果值。

然后使用结果索引并通过选择它们返回数据并返回;

接下来我将通过一个例子来描述......

答案 1 :(得分:0)

这是一个典型的N + 1查询问题(google it)。你有一些循环在每次迭代中调用Calc(),因此产生了大量的SELECT。

正确的技术是对参数进行分组(您提到了10000种组合)并在一次查询中加载它们。这样你最终得到一个相对较小的数据集,匹配变得便宜得多。