2010-05-17 44 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