两个MySQL请求同时 - 性能问题

时间:2014-07-03 09:59:08

标签: mysql sql database database-performance

我有一个带有许多innodb表的MySQL服务器。 我有一个后台脚本,它只需要一个删除/插入一个请求:它从表2中删除了数百万行,然后使用表1中的数据向表2插入数百万行:

INSERT INTO table 2 (date)
SELECT date from table 1 GROUP BY date

(请求实际上更复杂但是要显示我正在做什么样的请求。)

同时,我将运行第二个后台脚本,它执行大约一百万个INSERT或UPDATE请求,但是单独执行(我的意思是,我执行第一个更新查询,然后执行插入查询等。 ..)在表3中。

我的问题是,当一个脚本运行时,它很快,就像我们说每个需要30分钟,所以总共1小时。但是当两个脚本同时运行时,它非常慢,就像需要5h而不是1h。

首先,我想知道是什么原因造成的?是因为IO性能? (就像mysql写在两个不同的表中,所以在两者之间切换很慢?)

我怎么能解决这个问题?如果我可以说在我的第二个后台脚本运行时暂停了大的INSERT查询,那就太好了,例如......但是我找不到办法做这样的事情。

我不是MySQL管理专家。如果您需要更多信息,请告诉我们!

谢谢!

2 个答案:

答案 0 :(得分:1)

百万INSERT的30分钟并不快。您在date列上有索引吗? (或用于转动的任何列)

关于你原来的问题。如果不了解你的脚本和表结构的细节,很难说很多,但是脚本分别快速运行的一个可能原因是因为你正在做类似的SELECT查询,可能会被MySQL缓存,然后重用于后续查询。但是如果你并行运行两个查询,那么相应查询的SELECT可能不会保留在缓存中(因为有两个并发进程一直发送新查询)。

您可能希望为某些查询显式禁用缓存,您确定只运行一次(使用SQL_NO_CACHE修饰符)并查看它是否发生了任何变化。但我首先考虑索引并进入你的表结构,因为30分钟似乎非常慢:)例如。如果您知道始终在给定时间段内(例如按月)选择条目,您可能还想为表格引入按日期分区。确切的技巧取决于您的数据。

更新:另一个问题可能是你的查询都使用同一个表(表1),而MySQL中的默认事务隔离级别是REPEATABLE READS afair。因此,可能是一个查询正在等待,直到另一个查询完成,以满足事务隔离级别。如果您确定在脚本处理表1时未更改表1,则可能需要降低事务隔离级别。

答案 1 :(得分:0)

您可以使用事件调度程序,以便设置mysql以在一天中的不同时间启动此查询,在另一个与stackoverflow相关的问题中,您有一个如何执行此操作的示例:MySQL Event Scheduler on a specific time everyday

要记住的另一件事是使用解释计划来查看查询速度慢的原因。