PHP - 优化SQL为非常大的表选择多行

时间:2014-01-22 19:39:07

标签: php sql select

我有一张非常大的桌子〜十亿行。

foreach($idArray as $id){
     'SELECT DIE_X, DIE_Y, LOG_INDEX, TREND_ELEMENT, TREND_DATA FROM trend_data_level_5 WHERE TREND_INDEX =' $id;
     $result = mysql_query($query);
}

随着我的桌子变得越来越大,这种方法需要很长时间。我正在为我的SQL数据库使用innoDB引擎。

我跑了一个计时器,上面的循环花费了 ~17秒,表格大小约为15百万。想象一下,这需要多长时间才能达到数十亿行!

我可以大大缩短这段时间吗?如果是这样,最好的方法是什么?

编辑:这是表格的样子

------------------------------------------------------------------------------------------------------------------------------------------------+
| Table              | Create Table
                                                                                                                                                |
+--------------------+--------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------+
| trend_data_level_5 | CREATE TABLE trend_data_level_5 (
  LOG_INDEX int(5) DEFAULT NULL,
  DIE_X int(3) DEFAULT NULL,
  DIE_Y int(3) DEFAULT NULL,
  TREND_INDEX int(10) DEFAULT NULL,
  TREND_ELEMENT varchar(3) DEFAULT NULL,
  TREND_DATA int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------------+--------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------+

4 个答案:

答案 0 :(得分:0)

如果trend_index是主键,则使用如此。 否则使用trend_index创建索引: 在T1(B)上创建指数B;

如果它是独一无二的,那就这样吧 在T1(C)上创建独特的索引C;

对于简单的查询应该足够了。

答案 1 :(得分:0)

首先,我会使用MYSQLI扩展名。更多信息:MySqli manual

其次,我不知道有多少项可以包含$idArray数组,但你可以这样做一句话:

$list = implode(",", $idArray);
$query = "SELECT DIE_X, DIE_Y, LOG_INDEX, TREND_ELEMENT, TREND_DATA FROM trend_data_level_5 WHERE TREND_INDEX IN ($list)";
$stmt = $your_mysqli_object->prepare($query);
$stmt->execute();
$stmt->store_result(); // This releases the real transaction and charges the data to PHP

while($stmt->fetch())
{
    //...
}

它可能不是最优化的代码(我确定它不是)但是,在这种情况下,你只进行一次查询,然后循环结果做你的魔法

我希望我帮助过你。如果它运行正常或者您找到了更好的解决方案,请告诉我。我也想学习!

答案 2 :(得分:0)

这是一个非常基本的问题。答案是使用索引(你没有),网上有很多资源可以帮助你弄清楚如何做到这一点。

答案 3 :(得分:0)

我建议使用PDO。然后你将不得不使用一个准备好的查询(循环中的查询是一个非常糟糕的做法,因为它非常慢!),然后你会做一个$pdo->fetchAll(),它将为你带来一个二维数组(或数组,如果你愿意的话)。然后你就可以通过该阵列安全地完成foreach 如果您需要进一步解释,请告诉我。