mysql MyISAM的表锁优化

                                                                    mysql MyISAM的表锁优化mysql

    mysql 比oracle 灵活的地方有:能够对每一张表进行引擎的设定。咱们最经常使用的两种引擎就是MyISAM 和 Innodb。但若是没有搞清楚两种引擎的区别的话,仍是很容易出问题的。
sql

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

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

    3、InnoDB支持外键,MyISAM不支持oracle

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

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

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

    上面的七条来至(http://www.jb51.net/article/54352.htm),可是这个只是比较粗浅的认识。设计

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

//设置并行插入的sql,也能够去修改my.conf
set global concurrent_insert=2;

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

相关文章
相关标签/搜索