【问题标题】:Column locking in innodb?innodb中的列锁定?
【发布时间】:2010-05-17 00:50:51
【问题描述】:

我知道这听起来很奇怪,但显然我的一个专栏被锁定了。

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。

一点背景知识,第一个语句搞砸了,在此之前我不得不手动杀死。

【问题讨论】:

    标签: mysql locking innodb database-administration


    【解决方案1】:

    您的 (type_id, updated_at) 似乎没有索引,而且您的表相当大。

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

    CREATE INDEX type_updated_idx ON table (type_id, updated_at);
    

    假设,您有足够的权限进行数据定义语句。

    【讨论】:

      【解决方案2】:

      您是否尝试在受影响的表上运行ANALYZE TABLE

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

      【讨论】:

      • 刚刚运行它 - 看起来非常好。感谢您阅读 innodb 限制!
      • Innodb 具有行级锁定,这意味着如果更新 10 亿行中的 10 行,您可以访问除这 10 行之外的所有行。Myisam 具有表级锁定,这意味着如果您更新 10 亿行中的 10 行在更新完成之前,您将无法访问 100 亿行中的任何一行。我已经完全停止使用 myisam 并且从不后悔。
      【解决方案3】:

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

      【讨论】:

      • 谢谢!它说“访问被拒绝;您需要此操作的 SUPER 权限” - 知道为什么吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多