【发布时间】:2017-12-08 21:24:30
【问题描述】:
我有一张在 InnoDB 引擎中的表,非常简单,有 25000 行。当我做一个简单的 ALTER 时,它运行了将近 10 分钟:
mysql> ALTER TABLE `quote_followups_istvan`
ADD `customer_ip2` VARCHAR(20) NOT NULL DEFAULT '' AFTER `comment`;
查询正常,0 行受影响(10 分 52.82 秒) 记录:0 重复:0 警告:0
但是当我将它的引擎更改为 MyISAM 时,我得到了这个:
mysql> alter table quote_followups_istvan engine="MyISAM";
查询正常,25053 行受影响(0.56 秒) 记录:25053 重复:0 警告:0
mysql> ALTER TABLE `quote_followups_istvan`
ADD `customer_ip3` VARCHAR(20) NOT NULL DEFAULT '' AFTER `comment`;
查询正常,25053 行受影响(0.37 秒) 记录:25053 重复:0 警告:0
所以 10 分钟 vs 0.37 秒....
我在这里错过了什么?
【问题讨论】:
-
编辑:事实上,特定的 ALTER 查询需要一段时间(显然),我不知道为什么。例如,更改引擎很快,所以问题不在于 ALTER 本身。
-
吃一个橙子需要 90 秒。吃一个苹果需要 30 秒。吃一个苹果需要12秒。所以下次我想吃橙子的时候,我就买一个苹果代替吃,因为它更快。回到你的问题:MyISAM 的工作方式与 InnoDB 不同。有些事情更快。如果您想最终得到相同的结果(带有附加列的 InnoDB 表),则必须将表切换回 InnoDB 并将其包含在您的时间中。尽管实际原因可能是某些东西锁定了您的表,因为具有 25k 行的表应该更快地更改。
-
该表没有被锁定,它是一个测试表,没有被任何进程使用。除此之外,我真的不明白为什么我要转换回 InnoDB 并计算时间。我的目标实际上是制作一个可以快速使用 InnoDb 的查询。我只是将表转换为 MyISAM,因为我正在试验它,没有计划将它保留在那个引擎中。
-
嗯,这只是一个猜测,因为 10 分钟似乎有点多(所以尝试重复它,它也可能是例如缓存)。我希望它在 1:10 的范围内比 1:200 的范围更大。但是,您仍然在比较苹果和橙子。 InnoDB 和 MyISAM 的工作方式完全不同(!!)。 InnoDB 将例如允许您在更改表的同时更新数据,MySQL 不允许。如果它需要 0.37 秒并不重要,但在现实世界中,它需要更长的时间。所以是的,不同引擎上的某些操作比其他操作更快。不太清楚您为什么对此感到疑惑。
-
我很清楚 InnoDB 和 MyISAM 的工作方式不一样,事实上,我有几个理由将表保留在 InnoDB 引擎中。将其转换为 MyISAM 只是一个实验,因为我不知道该做什么了。这个想法根本不是将其转换为 MyISAM 引擎,进行更改并将其隐藏回来......不过,这在执行时间上是一个非常大的差异(是的,我已经尝试了几次,所以缓存不是产生显着差异),我宁愿认为(希望)有人会指出我遗漏了一些非常明显的东西。
标签: mysql performance innodb alter percona