2016-08-21 36 views
1

我有表arseh所有字段都是主鍵。所有字段都有索引。它有1000萬條記錄。從一張表中選擇超過10000次

 
     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; 
} 

我需要調用函數計算器多不同的和隨機參數10,000次。

問題:這種情況下(調用計算10000次)需要20秒完成。如何減少這個時間?

如果我插入整個數據表的數組一次和其他時間搜索數組而不是從表中選擇更好?

+0

您的表格是如何編制索引的? –

+1

並且數據庫每次調用時都會創建一個新的數據庫連接?還是使用現有的數據庫連接(如果已經設置了)? –

+0

所有字段都有索引 – ashkufaraz

回答

1

您可以預測所需數據並在查詢時間內加載更小的數據。 但另一種方法是索引搜索,我在這裏描述:

首先加載所有數據並將它們保存在全局變量中。

然後讓兩個數組一個FromYear而它的指數設置爲FromYear值和另一個用於ToYear而它的指數設置爲ToYear和兩個值設置爲數據索引。

然後按其索引和您的需求過濾ToYear和FromYear數組。

然後相交結果值。

然後使用結果索引並通過選擇返回數據並返回;

下面我將通過一個例子來描述更多...

0

這是一個典型的N + 1查詢問題(谷歌它)。你有一個在每次迭代中調用Calc()的循環,因此創建了大量的SELECT。

正確的技術是將您的參數(您提到10000個組合)分組並將其加載到一個查詢中。這樣你最終得到一個相對較小的數據集,並且匹配變得便宜得多。

+0

我不知道函數Calc()的參數,這些參數是隨機的 – ashkufaraz

+0

如果您的意思是您從數據庫或其他來源接收參數,您仍然知道所有參數在運行10000次迭代之前。所以,不要迭代和調用Calc(),你應該首先加載數據。 –

+0

好主意哥們感謝啓發;) – MSS