我的mysql当前数据库存在问题。
我有超过100个连接等待选择记录。当我执行时:
show processlist;
选择查询是一个大查询,其他查询是超级查询和插入,更新。
我有一个包含100个表的数据库,而select正在使用5个连接。
有没有办法临时停止进程并让其他进程运行,一旦完成所有进程,select就可以继续运行了?
答案 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。
第二种方式: 尝试使用索引加速长时间运行选择。这就是所谓的时间记忆权衡。您可以使用更多内存来加速查询以保存索引树。
第三种方式: 通过重新排列查询(加入和选择)来加速长时间运行选择。分析所有查询部分的成本。