【问题标题】:Mysql changing table engine MyISAM to InnoDBMysql 将表引擎 MyISAM 更改为 InnoDB
【发布时间】:2014-02-26 22:51:47
【问题描述】:

在我的网站上,我有一个包含 1000 万行的访问者表。
对站点的每个请求都会向表中插入行,以防表被锁定(通常在优化查询中)访问者无法进入站点
表引擎是 MyISAM,我想把它改成 InnoDB
我有几个问题:

  • 如何在不停止网站工作的情况下更改表引擎
  • 有一种方法可以优化 InnoDB 表而不锁定它

【问题讨论】:

    标签: mysql innodb myisam


    【解决方案1】:

    最简单的方法是

    ALTER TABLE table_name ENGINE = InnoDB;
    

    如果您使用 InnoDB 引擎,则不必担心锁定表,因为该引擎按行锁定数据。

    【讨论】:

    • 如果我将引擎从 MyISAM 更改为 InnoDB,表将被锁定?
    • 是的,我想是的。但您可以在您的网站访问者较少时这样做。
    • 我只是想确定一下,InnoDB表的优化是否会锁定表以进行写入?
    • 如果您想确保该表将被锁定。运行前ALTER运行LOCK TABLE table_name WRITE;和运行后UNLOCK TABLES;
    【解决方案2】:

    oleksii.svarychevskyi 是对的,InnoDB 使用行级锁,但如果你这样做

    ALTER TABLE table_name ENGINE = InnoDB;
    要将 table_name 从 MyIsam 更改为 InnoDB,将存在元数据锁定(在表级别),因为原始表引擎是 MyIsam。
    如果您尝试对 table_name 执行 UPDATE,此 UPDATE 将被排入队列,直到 ALTER TABLE 结束(如果您执行 SHOW FULL PROCESSLIST,您将看到与 UPDATE 关联的“等待表元数据锁定”消息)。

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 2014-09-08
      • 2010-11-12
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多