我有一个复杂的SQL问题,我试图简化,但它仍然非常慢。问题是它很慢,因为我运行了几千个查询来收集我的所有数据,我的心告诉我,SQL有一种方法可以更好地为我做这些,所以查询分析器可以找到我自己的代码不能提高的效率。我试着在下面简化,所以我希望它是可以理解的,我没有犯错。
我有两个表:“操作”和“操作时间”。
“操作”包含5000条记录,其中包含姓名,号码等。 “操作”是由仓库中的机器执行的1个动作,例如“油漆箱红色”或“带有装配日期的印章箱”
每天所有操作都恰好发生一次。每次操作发生时,它都成为“操作时间”表记录。 “时间”记录有“操作1521发生在2016-01-16 13:45:00,机器1为12秒”。每台操作同时发生10台机器,因此相同的操作号和日期将有10条记录,时间不同。 (机器不完全相同,所以时间不一样。)因此,每台操作记录会产生10个操作时间记录,因为有10台机器。
5000操作x每天1次x 10机器=每天在“操作时间”表中记录50,000次。我们保留1年的数据,因此50,000 x 365 = 18,250,000的运营时间记录。
这是我们的情况。
我们正在尝试优化我们的机器,并希望看到每次操作的机器速度随时间的变化。我们更改机器的一部分或机器的设置,然后第二天运行操作。我想告诉我所有操作和每个操作eeach机器工作多长时间,如果比1个月前和6个月前相同的机器时间操作更快或更慢。所以:
Paint box red
Machine 1: 12 seconds (1m 12 seconds, 6m 16 seconds)
Machine 2: 11 seconds (1m 11 seconds, 6m 11 seconds)
Machine 3: 13 seconds (1m 16 seconds, 6m 26 seconds)
Machine 4: 13 seconds (1m 12 seconds, 6m 16 seconds)
所以你从中看到我可以看到机器1有点快,机器2没有改变,机器3越来越好,机器4正常。
这就是我们想要的。
我现在正在做的事情很慢。就是这样:make query SELECT operation_id, operation_name FROM operations
获取打印输出标题的操作列表。然后对于每个操作,我说三次:SELECT machine_id, time_taken FROM operationtime WHERE operation_id = :operation_id AND operation_time = :operation_time
并将:operation_time
更改为最新时间,1个月时间和6个月时间。三个读数。 operation_id有索引。我尝试添加operation_time索引,但这使得它变得非常慢。
然后我将结果放在PHP中:
我们有1000个操作,因此这将成为3000个查询并添加所有PHP循环时间。有1800万行,这非常慢。这需要很长的时间才能运行。我们的目标是优化机器从1000操作到10000操作,但我不认为我们当前的数据库可以做到这一点,因为它现在非常慢,并且只有在增加更多操作时才会变得更慢。
我想要的是可以为我工作的SQL查询因为我希望MySQL可以分析我正在做的事情并找到最有效的回答方式。 “这是操作ID列表,请为每个操作给出每台机器的结果:当前时间,1个月时间和6个月时间。”
如果它是完美的,我会得到像“机器1”,“今天时间”,“1米时间”,“6米时间”这样的列名,但我不认为这是可能的。也许如果我能在一个查询中至少得到所有答案,我仍然可以使用PHP将数据分组到操作和机器中。
我正在使用MySQL,我正在使用InnoDB。我有关于operation_id的索引。
我很抱歉这是一个复杂的问题。我尽可能简单,希望我没有犯错。谢谢你的阅读。任何建议都有帮助,谢谢!