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;

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


相关文章

写在最后

那么人生何处不爬虫,爬虫请标http://blog.csdn.net/qing_gee
学而不思则罔,思而不学则殆!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值