刚入门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;

例子基本上都是书中给的,所以我不是我原创的,给自己积累一点知识。


相关文章

写在最后

那么人生何处不爬虫,爬虫请标
学而不思则罔,思而不学则殆!