我有一张非常大的桌子〜十亿行。
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 |
+--------------------+--------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------+
答案 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
如果您需要进一步解释,请告诉我。