mysql myisam 去掉表锁a_mysql MyISAM的表锁优化

mysql MyISAM的表锁优化

mysql 比oracle 灵活的地方有:可以对每一张表进行引擎的设定。我们最常用的两种引擎就是MyISAM 和 Innodb。但如果没有搞清楚两种引擎的区别的话,还是很容易出问题的。

一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及设计到安全性就高的应用

三、InnoDB支持外键,MyISAM不支持

四、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表

五、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表

六、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

我们当时有一张表选择MyISAM的时候是因为该存储引擎比Innodb速度块很多,当时我们做的是采集系统,为了提高效率就采取的是批量插入。虽然我们开始知道MyISAM是表锁的情况,但是我们却不知道正好在批量插入的时候,一个简单的select语句会被阻塞这么久。(开始没有遇到,偶然发现的,还好当时没有上线)这个时候去查了一些MyISAM存储引擎的一些更深入的特性发现:对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!所以其实MyISAM存储引擎适合,一些读操作远远大于写操作频率的业务,但我们又很喜欢该引擎的批量插入的速度。最后强行改了读操作的优先级(不推荐使用有血泪史),并开启了concurrent_insert=2的模式。第一个是先保证用户查询操作优先,第二是开启并行插入,这个插入是有要求的(插入到表的最后,不影响当前的查询操作)。就不会调整插入位置了,如果有部分数据会删除的记得要:定期使用OPTIMIZE TABLE语法优化,可以减小文件的碎片。

//设置并行插入的sql,也可以去修改my.conf

set global concurrent_insert=2;

最后还是推荐使用Innodb存储引擎, 上次听一个数据库讲座时候说的,MyISAM已经很久没有更新过了,所以现在数据库都是默认使用Innodb,而且优化了很多版本的Innodb查询速度并不差MyISAM存储引擎了(而且稳定性前者更是高的多)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值