2017-07-05 58 views
-1

我有一个在InnoDB引擎中的表,非常简单,有25000行。当我做一个简单的改动,它运行了近10分:MySQL(Percona 5.7)用InnoDB引擎减慢ALTER表... ...?

mysql> ALTER TABLE `quote_followups_istvan` 
     ADD `customer_ip2` VARCHAR(20) NOT NULL DEFAULT '' AFTER `comment`; 

查询OK,0行受到影响(10分52.82秒) 记录:0重复:0警告:0

但是,当我改变它的发动机的MyISAM,我得到这个:

mysql> alter table quote_followups_istvan engine="MyISAM"; 

查询确定,受影响(0.56秒)25053行 记录:25053次重复:0警告:0

mysql> ALTER TABLE `quote_followups_istvan` 
     ADD `customer_ip3` VARCHAR(20) NOT NULL DEFAULT '' AFTER `comment`; 

查询OK,25053行受到影响(0.37秒) 记录:25053次重复:0警告:0

所以10分钟VS 0.37s ....

这里我错过什么AMD?

+0

编辑: 事实上,特定的ALTER查询花了一段时间(显然),我不知道为什么。例如,改变引擎速度很快,所以问题不在于ALTER本身。 –

+1

吃橘子需要90秒。一个苹果需要30秒。吃苹果需要12秒钟。所以下次我想吃一个橙子时,我会买一个苹果,然后吃,因为它更快。回到你的问题:MyISAM与InnoDB的工作方式不同。有些事情更快。如果你想得到相同的结果(一个带有额外列的InnoDB表),你将不得不将表切换回InnoDB并在你的时间中包含它。虽然实际的原因可能是锁定你的表的东西,因为具有25k行的表应该更快地改变。 – Solarflare

+0

表未锁定,它是一个测试表,不被任何进程使用。 除此之外,我不太明白为什么我会将其转换回InnoDB并计入这个时间。我的目标实际上是进行一个能够与InnoDb一起快速运行的查询。我只是将表格转换为MyISAM,因为我正在试验它,没有计划保留它。 –

回答

0

让我回答我自己的问题。像这样的

optimize mySql for faster alter table add column

和多阅读,文章,居然说这是“问题”与InnoDB表,并提出了一些替代方法。

所以我只能断定这是一个正常的行为。

+1

是的,这很正常 - 对于25k行,十分钟有点高,但它们可能是非常大的行,具有异常数量的索引,服务器可能很慢等。如果您正在对生产数据库进行模式更改,像https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html可以帮助防止停机。 – ceejayoz

+0

数据库正在生产中(表格本身不是),服务器是具有64Gb RAM的Skylake i7,具有相对较大的innodb缓存池,并且此时为MyISAMs启用了一些查询缓存 –