无法更新记录,卡住了

时间:2012-01-02 00:38:26

标签: mysql database process myisam

我的mysql当前数据库存在问题。

我有超过100个连接等待选择记录。当我执行时:

show processlist;

选择查询是一个大查询,其他查询是超级查询和插入,更新。

我有一个包含100个表的数据库,而select正在使用5个连接。

有没有办法临时停止进程并让其他进程运行,一旦完成所有进程,select就可以继续运行了?

3 个答案:

答案 0 :(得分:12)

我建议让查询执行它需要做的事情,如果你停止任何或终止进程或查询,你可能会遇到可能导致重大错误的数据完整性错误。

BookOfZeus和tfb785是对的,首先你可能有索引错误。解释将告诉你究竟是什么问题以及要寻找什么。例如,如果你有5个连接,并且你得到行数,例如100,000和100以及1和1和1,你将会有多个100,000 * 100,这可能会超级慢。

仔细阅读解释告诉您的内容并根据它优化您的查询。

innodb可能是一个不错的选择,如果你经常访问这些表,因为它的行锁定是myisam的表锁定。

我会说首先尝试优化您的查询,也许您不需要更改表引擎来解决问题。如果你还有问题,那么你可以考虑转移到innodb。

答案 1 :(得分:4)

  

有没有办法临时停止进程并让其他进程运行,一旦所有进程完成,那么select可以继续运行?

我相信您使用MyISAM作为存储引擎。

MyISAM中,读取查询会阻止并发写入查询。这样可以确保写入不会更改正在处理的数据,并且不会更新一半的记录集,另一半不会更新。

无法按照您的要求停止SELECT查询:写入可能会使记录集返回不一致。虽然它可能不是您的设置中的实际情况,理论上写入可能不会影响读取(例如,读取和写入不同的记录),MyISAM不知道这一点,它总是阻止整个表,以防万一

如果您需要写入不阻止读取,请切换到InnoDB(尽管有些情况下写入也会阻止读取)。

答案 2 :(得分:4)

您无法停止正在运行的查询并为其他查询留出时间。但是有三种方法可以解决您的问题:

第一种方式: 隔离级别http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html 这些也意味着你必须改变你的存储引擎,例如。到InnoDB。

第二种方式: 尝试使用索引加速长时间运行选择。这就是所谓的时间记忆权衡。您可以使用更多内存来加速查询以保存索引树。

第三种方式: 通过重新排列查询(加入和选择)来加速长时间运行选择。分析所有查询部分的成本。