2010-05-17 43 views
1

我知道这听起来很奇怪,但显然我的一列被锁定。在innodb中锁定列?

select * from table where type_id = 1 and updated_at < '2010-03-14' limit 1; 

select * from table where type_id = 3 and updated_at < '2010-03-14' limit 10; 

即使在几个小时内第一个也不会跑完,而第二个完成顺利。唯一的区别是2个查询之间的type_id。

有点背景的,第一条语句搞砸了这之前,我不得不手动杀死。

在此先感谢您的帮助 - 我有一个紧急的数据工作,完成任务,而这个问题是让我疯

回答

0

看起来你没有索引(type_id,updated_at),你的表格相当大。

创建索引应该可以解决问题:

CREATE INDEX type_updated_idx ON table (type_id, updated_at); 

假设,你有足够的权限,以使数据定义语句。

0

你试过运行受影响的表中的ANALYZE TABLE

您可能需要考虑转换为MyISAM表,因为InnoDB表具有problems和限制。

+0

只是跑了它 - 看起来非常好。感谢您阅读innodb的限制! – 2010-05-17 03:03:36

+0

Innodb的具有行级锁定,这意味着如果10 1十亿行正在更新,您可以访问除10 MyISAM的所有行具有表级锁,如果你更新,这意味着1个十亿行,你会不会是10能够访问100亿行中的任何一行,直到更新完成。 我已经完全停止使用myisam并且从未后悔过。 – John 2018-01-06 06:01:10

0

列无法锁定 - 但索引范围可以。 Show innodb status通常会在您正在等待哪些活动交易后告诉您。

+0

谢谢!它说“访问被拒绝;您需要SUPER权限进行此操作” - 任何想法为什么? – 2010-05-17 04:30:35