2012-01-02 98 views
12

我有我的当前数据库与MySQL的问题。无法更新记录,卡住

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

show processlist; 

选择查询是一个大的查询,其他人是小问题和插入,更新。

我有一个数据库有100个表,选择使用5个连接。

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

+1

解释你的查询,也许你有索引问题 – 2012-01-02 00:40:12

+0

例如,一个INSERT如何等待SELECT?我不想相信任何配置好的现代SQL服务器都会出现这个bug ... – 2012-01-02 00:53:31

+1

@PéterVarga:在MyISAM中,读取操作可以阻止写入操作(反之亦然)。 – Quassnoi 2012-01-02 00:55:14

回答

12

我会建议让查询做它需要做的事情,如果您停止任何操作或终止进程或查询,则可能会导致数据完整性错误,从而导致严重错误。

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

仔细阅读解释告诉你什么,并根据它优化你的查询。

如果您经常访问表,innodb可能是一个不错的选择,因为它的行锁定对myisam的表锁定进行了检查。

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

+0

让我检查我有什么 – 2012-01-11 00:51:56

+0

哦f ** k你是对的我有:1,314,145在1桌上, 1,292在第二张桌子上,11在第三张桌子上,其余的都是1.所以这意味着1,314,145 * 1292 * 11 * 1 * 1? – 2012-01-11 00:55:46

+0

这是你的问题,确保索引是好的,钥匙是(PK,钥匙和fk)都设置正确 – 2012-01-11 00:57:29

4

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

我相信你正在使用MyISAM作为存储引擎。

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

没有办法停止SELECT查询的方式你问:写入可能会使记录集返回不一致。虽然它可能不是您的设置中的实际情况,理论上写入可能不会影响读取(例如,读取和写入不同的记录),但MyISAM不知道,并且始终会阻止整个表,以防万一。

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

4

您无法停止正在运行的查询并将时间留给其他查询。但是,有三种方法来解决问题:

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

第二种方式: 尝试加快您的长时间运行选择带指数的。这是所谓的时间记忆折衷。你用更多的内存加速你的查询来保存索引树。

第三种方式: 加快您的长时间运行选择重新排列查询(连接和选择)。分析所有查询部分的成本。