我有在同一个表上测试过的代码,但只有几条记录。 它在少数(30)记录中表现很好。完全按照我的意愿去做。
当我向表中添加200条记录时 - 它会锁定。我必须重新启动apache并尝试等待它完成。
我可以帮助找出原因。
我的桌子有适当的索引,我没有任何其他方面的麻烦。 提前谢谢。
UPDATE `base_data_test_20000_rows` SET `NO_TOP_RATING` =
(SELECT COUNT(`ID`) FROM `base_data_test_20000_rows_2`
WHERE
`base_data_test_20000_rows_2`.`ID` != `base_data_test_20000_rows`.`ID`
AND
`base_data_test_20000_rows_2`.`ANALYST` = `base_data_test_20000_rows`.`ANALYST`
AND
`base_data_test_20000_rows_2`.`IRECCD` =
(SELECT COUNT(`ID`) FROM `base_data_test_20000_rows_2`
WHERE `IRECCD` =
(select MIN(`IRECCD`) FROM `base_data_test_20000_rows_2`
WHERE
`base_data_test_20000_rows_2`.`ANNDATS_CONVERTED` >= DATE_SUB(`base_data_test_20000_rows`.`ANNDATS_CONVERTED`,INTERVAL 1 YEAR)
AND
`base_data_test_20000_rows_2`.`ID` != `base_data_test_20000_rows`.`ID`
AND
`base_data_test_20000_rows_2`.`ESTIMID` = `base_data_test_20000_rows`.`ESTIMID`
)
)
)
WHERE `base_data_test_20000_rows`.`ANALYST` != ''
该代码只是为了寻找特定经纪人的一年 - 获得最低评级 - 然后计算分析师评级最低的次数。将该值写入NO_TOP_RATING列。
答案 0 :(得分:1)
我很确定我的原始建议是错误的,因为你的查询有条件而将选择计数归结为它自己的号码将无济于事
这只是一个hackish解决方案。解决此问题的真正方法是优化查询。但是,作为一种解决方法,您可以将记录计数设置为mysql变量,然后在查询中引用该变量。 击>
这意味着您必须确保在运行查询之前将计数设置为变量。但这意味着如果在设置变量和完成运行查询之间添加记录,则无法获得正确的计数。
击><击> http://dev.mysql.com/doc/refman/5.0/en/user-variables.html 击>
进一步的想法: 在提交这个答案之前,我仔细看了一下。这可能实际上是不可能的,因为你有where语句,这些语句是针对每条记录的个性化。
它很慢,因为您使用的查询在查询中计数,该查询在具有最小值的查询中计数。这就像每次迭代一行时,每行迭代三次。这是指数搜索。因此,如果数据库有10条记录,则每条记录可能需要10 ^ 3次。在您拥有的行数中,这是地狱般的。
我确信有办法做你想做的事,但我实际上无法告诉你要做什么。
我不得不同意DRapp看到虚假数据可以帮助我们分析真实情况。
由于我不能完全理解这一切,我会尝试的,如果不完全理解你在做什么,将创建每个子查询的视图,然后对其进行查询。 http://dev.mysql.com/doc/refman/5.0/en/create-view.html
但这可能不会逃避冗余,但它可能有助于提高速度。但由于我不完全明白你在做什么,这可能不是最好的答案。
另一个不太好的答案是,如果你没有在关键任务数据库上运行它,并且它可以在运行查询时脱机,那么你可以改变你的mysql设置并让这个查询运行你引用的那几个小时并希望它不会崩溃。但这似乎不太理想,因为我不知道是否需要额外的磁盘空间或内存来预制。
在这一点上我真的能给你最好的答案,就是试着看看你是否可以从不同的角度来解决你的问题。或者发布一些关于Base_data_test_20000_rows中的信息的虚拟数据,以及查询运行后您期望它的样子。
- 希望有助于指出正确的方向