我在具有8GB RAM的Windows Server 2008 R2计算机上使用MySQL 5.1。
我每周更新2个数据库。 两个数据库都由MyISAM表组成,我运行一个脚本来执行必要的INSERT(无UPDATEs / DELETE)到一些表(下面的表gp有超过370,000,000行)。
在执行mysql脚本的过程中(整个过程大约需要2.5个小时),我可以看到与INSERT同时运行的SELECT语句(但在不同的表,甚至在不同的数据库中)被“阻塞”,只是挂起,直到整个插入过程结束。
一个插入插入将大约50-60对整数进入gp表,这可能需要2-4秒(整个过程将有大约2000-4000每个这些)。 所以,如果在INSERT中有10个SELECT,那么所有这些都会在SHOW PROCESSLIST中看到。
Id User Host db Command Time State Info 35 root localhost:36954 db Query 1 update INSERT INTO db_2.gp VALUES(@g,669313116),(@g,...),... (@g is an integer variable and there would normally be about 50-60 pairs of values here) 42 root localhost:38019 db Query 113 Sending data SELECT * FROM db.g WHERE ...
SHOW PROCESSLIST已在本地脚本testing运行中运行,但在更新时,可以在LIVE服务器上注意到相同的行为。 我不知道为什么SELECT被阻塞(上面只有一个SELECT来自本地主机,但在LIVE服务器上,可能有许多不同的SELECT从用户查询中排队)。
在上面的进程列表中,可以看到正在数据库db_2中的gp表上执行INSERT,而针对数据库db中的g表运行SELECT语句。 所以,他们是不同的表(在不同的数据库),所以我不明白为什么这里有一个locking问题。
有什么办法可以使INSERT不阻止SELECTs? 请不要告诉我使用InnoDB,因为我已经尝试过了,网站的速度大大减慢了。 我需要继续使用MyISAM。
在你给的例subprocess列表中, INSERT不是“阻塞” SELECT 。 几乎可以肯定的是, INSERT正在处理大量的I / O操作,使完成将数据发送到客户端所需的磁盘访问的SELECT操作变得困难。