【问题标题】:MySQL sequential read in a For LoopMySQL 在 For 循环中顺序读取
【发布时间】:2016-12-09 02:16:16
【问题描述】:

我有一个包含多个表(大约 100 个)的数据库,其中记录基于类别存储。每个类别是一个表,每个表包含多个项目。每个项目每天都有多个交易记录,每当发生交易时,每一行都有多个字段。

我需要根据条件获取每个项目的记录,并在应用程序(PHP 或 Python 程序)中执行一些操作(例如:某种聚合)。结果再次存储在另一个数据库表中。

目前我正在为每个项目手动运行操作。通过将项目作为参数传递来为每个项目执行程序。但是每天都有新的品类和新的物品,让我很难调整手动执行。

以下是我尝试自动化的方法,但没有一种方法奏效。

  1. 在 for 循环中为每个项目运行 MySQL 查询,但执行不工作或仅在一个项目上执行。 这是我用于为每个项目提取数据的控制器,但这并不要求所有项目。它仅适用于第一项或最后一项。 我也不能让循环等到数据库拉取完成。

for($i=0;$i<$total_items;$i++) { $data['results'] = $this->scripts_model-> run_daily_stats($item, $Parameter1, $Paramet2); //Use the Results in some operations, and then proceed with next result set. }

  1. 为每个项目创建平面文件并提取记录。这在一些现存的情况下是有效的,但是根据条件从平面文件中提取记录似乎也同样困难。并且重新创建每个文件都不起作用。
  2. 通过添加新行将所有项目放入批处理作业中,每 30 秒执行一次,但完成所有项目需要很长时间,而且我需要每天更新批处理文件。

这是我正在使用的示例批处理文件。现在有 320 行,运行大约 2 小时。而且我每天都添加多行。所以预计这会增加总执行时间。

15 12 * * * wget 127.0.0.1/~home/scripts/update_daily/item1 >/dev/null 2>&1
15 12 * * * sleep 30; wget 127.0.0.1/~home/scripts/update_daily/item2 >/dev/null 2>&1
16 12 * * * wget 127.0.0.1/~home/scripts/update_daily/item3 >/dev/null 2>&1
16 12 * * * sleep 30; wget 127.0.0.1/~home/scripts/update_daily/item4 >/dev/null 2>&1

.
.
55 12 * * * wget 127.0.0.1/~home/scripts/update_daily/item234 >/dev/null 2>&1
.
.
.

4. Group multiple Items and put in a batch file, but the unable to run the program for each item.

有没有一种方法可以在不中断 MySQL 连接的情况下自动执行?请提出任何可以帮助我解决问题的技术或程序。

谢谢

拉维

【问题讨论】:

  • 请向我们展示您到目前为止所做的尝试!

标签: php python mysql codeigniter


【解决方案1】:

在考虑这个问题之前,我会敦促您重新检查数据库的结构。如果您有 100 个具有相同结构 (?) 的表,每个表代表一个不同的类别,那么拥有一个带有额外 category 列的表会简单得多,然后您可以使用该列来查询相关行。

由于您没有显示您描述的代码,因此任何人都很难说出您可能做错了什么,因为我们只知道您尝试过的事情“不起作用”。

【讨论】:

  • 感谢holdenweb。我同意将所有行放在一个表中,但我也使用表进行逐项读取,以提高读取性能。从一个有 100 万条记录的表中提取少量记录(每次读取大约 200 条)似乎效率低下。
  • 您的缺乏经验似乎在引导您走错路。在正确设计的数据库中,读取性能极不可能显着提高。除非你有证据表明它会是这样,否则你试图优化你不知道会导致问题的东西是错误的。
  • 也许你是对的。但是对我来说,对单个表上的多个项目进行多次读取和多次写入似乎是个坏主意。所以继续创建多个表。如果没有其他解决方案可用,我将尝试为我的聚合操作创建一个大表,并且所有读取都将在单独的表上。
  • 您使用数据库多久了?您的直觉不正确,导致您采用的解决方案不灵活且难以编程。
  • 我没有太多的数据库设计经验。无论如何,采用设计具有更大的灵活性,如果我需要在其中一个类别中添加额外的字段,我可以这样做而不影响其他表。现在将继续使用单表方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2013-03-21
  • 2023-03-08
  • 2010-09-21
相关资源
最近更新 更多