MySQL代码锁定服务器

时间:2014-12-26 23:39:58

标签: mysql

我有在同一个表上测试过的代码,但只有几条记录。 它在少数(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列。

1 个答案:

答案 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中的信息的虚拟数据,以及查询运行后您期望它的样子。

- 希望有助于指出正确的方向