2017-07-05 98 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啓用了一些查詢緩存 –