【发布时间】:2015-02-20 21:26:09
【问题描述】:
抱歉,这是一个愚蠢的问题。感谢您的宝贵时间。我四处搜索并找到了类似的问题/答案 - 但还没有找到我正在寻找的东西。
我习惯于通过 PHP 进行所有 MySQL 调用 - 但最近 - 我接到了一项任务,即处理一个包含 5000 000 个股票经纪人记录的非常大的数据库表。我拥有的 PHP 工作正常 - 但需要几个小时才能完成。认为使用简单的 MySQL 调用会快得多……“简单”的感觉让我迷失了。
我的表:
| ID | My_Stockbroker | My_Start_Date | My_End_Date | POST_SIZE |
| 1 | DAVE | 2000-06-19 | 2000-06-19 | 2 |
| 2 | DAVE | 1999-03-02 | 2002-09-06 | 0 |
| 3 | DAVE | 1999-03-14 | 2002-12-10 | 0 |
| 4 | SAM | 2000-06-19 | 2000-06-19 | |
更新的目标表是My_Table - 我想更新所有POST_SIZE' values onMy_Table`
我的 PHP 非常简单:
- POST_SIZE 最初为空白
- 从 My_Table = "DAVE" 中获取一个
My_Stockbroker名称 - 计算 My_Table 中 = "DAVE" 并且在特定日期范围内的任何其他记录(不包括正在处理的记录)
IE。
My_Table.My_Start_DateMy_Table.My_Start_Date&&My_Table.My_End_Date> "ID1".My_Table.My_Start_DatePOST_SIZE ++;
我的PHP代码是这样的:
// Get 1 record
$sql = "SELECT `ID`, ` My_Stockbroker`, `My_Start_Date`, from `".$Table."` WHERE ` My_Stockbroker` != '' AND `POST_SIZE` = '' LIMIT 1"; //
while($row = $result->fetch_assoc()){// while 1 record result
$ My_Stockbroker_To_Examin_ID = $row["ID"];
$ My_Stockbroker_To_Examin = $row[" My_Stockbroker"];
$ My_Stockbroker_To_Examin_My_Start_Date = $row["My_Start_Date"];
}
/////// GET ALL RECORDS FOR SPECIFIC My_Stockbroker that fall within specific date ///////
$sql = "SELECT `ID` FROM `".$Table."` WHERE `My_Start_Date` <
'".$My_Stockbroker_To_Examin_My_Start_Date."' AND `My_End_Date` >
'".$My_Stockbroker_To_Examin_My_Start_Date."' AND `My_Stockbroker` =
'".$My_Stockbroker_To_Examin."' AND `ID` != '".$ My_Stockbroker_To_Examin_ID ."'"; //
if($result = $conn->query($sql)){//
$POST_SIZE = $result->num_rows;
}
// now write back the number of rows found
$sql = "UPDATE `".$Table."` SET `POST_SIZE` = '".$POST_SIZE."', WHERE `ID` = '".$My_Stockbroker_To_Examin_ID."'; ";
正如我所说 - 我拥有的 PHP 代码完美无缺。 我只是没有时间等待它完成。
如何在一张表上仅使用 MySQL 来实现这一点?
读取一条记录/计算日期范围内的所有记录/将值写入POST_SIZE
我是否需要即时创建一堆临时表并加入等? 或者这可以在 MySQL 循环中实现吗? MySQL通常单独更快吗? - 还是我的 PHP 出了问题?
【问题讨论】:
-
你的表被索引了吗?
-
是的!非常感谢。
-
我正在寻找一个完整的语句,它写回每一行的
POST_SIZE列。 -
您在为每个股票经纪人单独查询什么?这确实是很多查询,可能会产生很大的影响。
-
还有一个原因是你不能只减去 1 而不是拥有整个
NOT子句吗?