天天看點

mysql之修改表引擎

剛入門mysql的時候,對innodb引擎和myisam引擎沒有很好的了解,是以表引擎用的基本上就是myisam,反正也不懂哪一個好,不過有人給我灌輸“如果查詢多的話,myisam比innodb要快得多”。現在想想當時是有多蠢!

場景

當時項目中有一張會員表,王二,也就是我,愚蠢的認為會員表相對來說,讀頻率要高于寫頻率,是以為了“性能”,果斷的選擇了myisam引擎。後來,後來項目正式上線後,就悲劇了,資料庫經常發生死鎖,弄得後來使用`kill來殺掉死鎖的sql查詢,現在回首往事,真是不堪啊!

果然,今天再次讀《高性能mysql》中關于引擎簡介一節時,才隐隐約約知道了什麼,“王二,你個sb”,對,就是這樣,我心裡默默罵着自己。

不要輕信“myisam比innodb快”的經驗之談。

看吧,作者告訴你了,到底什麼才是正确的。是以,“在沒有特殊需求時,表選擇innodb引擎”!

當然了,為了解決這個困擾了許久的問題,最後終于知道myisam是表級鎖,這樣在頻繁的讀寫時,就會發生大量的讀鎖無法擷取到資源。于是決定把myisam改為innodb引擎,當然在做這個過程時,依然非常可怕!

由于無知,王二,也就是我,直接通過navicat中進行了修改,當時看着navicat假死的狀态,差點以為項目又要挂掉了,過了很久很久,才從奄奄一絲的狀态恢複了元氣。好吧,我當時吓得有點半死。

今天才知道了答案:

表在修改引擎時會花費大量時間。mysql會按行将資料從原表複制到一張新表中,在複制期間可能會消耗系統所有的IO能力,同時原表上回加上讀鎖。是以,在繁忙的表上執行此操作要特别小心。

解決方案

mysql> show table status like 'girl' \G
mysql> create table boy like girl;
mysql> show table status like 'boy' \G
mysql> alter table boy engine=innodb;
mysql> insert into boy select * from girl;
mysql> show table status like 'boy' \G
mysql> select * from boy;      

原來是需要這樣做的,先建立另外一張表,再将複制資料。

大資料量時

mysql> start transaction;
mysql> insert into boy select * from girl where id between 1 and 2;
mysql> commit;
mysql> select * from boy;      

例子基本上都是書中給的,是以我不是我原創的,給自己積累一點知識。