将Mysql数据表引擎从MyISAM更改为InnoDB

12

在我的网站上,我有一个包含1000万行记录的访客表。
每次请求网站时,都会向该表插入新的一行,但如果表被锁定(通常是优化查询),则访问者将无法进入网站。
该表的引擎为MyISAM,我想将其更改为InnoDB。
我有几个问题:

  • 如何在不停止网站运行的情况下更改表引擎
  • 是否有一种方法可以在不锁定表的情况下对InnoDB表进行优化。
2个回答

19

最简单的方法是

ALTER TABLE table_name ENGINE = InnoDB;

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


如果我将引擎从MyISAM更改为InnoDB,表会被锁定吗? - Idob
是的,我也这么认为。但你可以在网站访问量较少的时候进行操作。 - oleksii.svarychevskyi
我只是想确认一下,优化InnoDB表是否会锁定写入表? - Idob
1
如果您想确保表被锁定。在运行ALTER之前运行LOCK TABLE table_name WRITE;,并在运行结束后运行UNLOCK TABLES; - oleksii.svarychevskyi

5

oleksii.svarychevskyi是正确的,InnoDB使用行级锁定,但如果您执行以下操作

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接