MyISAM

MyISAM引擎是MySQL关系数据库管理系统的默认存储引擎(5.5.xx版本之前),这种MySQL表存储结构从就的ISAM代码扩展出许多有用的功能,在新版的MYSQL中InnoDB引擎由于对事物参照的完整性,已经更高并发性等优点开始逐渐取代MyISAM引擎


MyISAM引擎特点:

1、不支持事物(事物是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败)

2、表级锁定(更新是锁整个表)。其锁定机制是表级索引,这虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能

3、读写相互阻塞。不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但是读本身不会阻塞其他读取。

4、只缓存索引。MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能,减少磁盘IO,但是这个缓存区只会缓存索引,不会缓存数据

5、读取速度快,占用资源相对少

6、不支持外键约束,但是支持全文索引

7、MyISAM引擎是mysql5.5.xx前的默认存储引擎。


MyISAM应用场景:

1、不需要支持事务的业务。如银行转账等肯定不支持

2、一般用于读数据较多的引用。读写都频繁的场景不适用,读多或者写多都可以。

3、读写并发访问相对较低的业务(纯读或者纯写高并发也可以)(锁定机制问题)

4、数据修改相对较少的业务(阻塞问题)

5、以读为主的业务。例如:www、blog、图片信息数据,用户数据库,商品库等业务

6、对数据一致性要求不是很高的业务

7、硬件资源相对差的服务器可以使用MyISAM


MyISAM引擎调优精要

1、设置合适的索引(缓存机制)

2、调整读写优先级,根据实际需求确保重要操作更优先执行

3、启用延迟插入改善大批量写入性能(降低写入频繁,尽可能多条一次性写入)

4、尽量顺序操作让insert数据都写入到尾部,减少阻塞

5、分解大的操作,减低单个操作的阻塞时间

6、减低并发数(减少mysql访问),某些高并发场合通过应用进行排队队列机制

7、对于相对静态(更改不频繁)的数据库数据,充分利用query cache或者memcached缓存服务可以极大的提高访问效率

8、可以把主从同步中的主库使用innodb,从库使用MyISAM

###########################################################################################

###########################################################################################

###########################################################################################




InnoDB引擎



InnoDB引擎是MySQL数据库另外一个重要的引擎,正成为目前 MySQL 数据库所发行的新版的标准,被包含在所以二进制安装包里,和其他的引擎相比, InnoDB引擎的优点时兼容ACID的事务,已经参数完整性(即支持外键)。



InnoDB引擎特点

1、支持事务。支持4个事务隔离级别,支持多版本读。

2、行级锁定(更新是一般是锁定当前行).通过索引实现,全表扫描仍然会使表锁。注意间隙锁的影响

3、读写阻塞与事务隔离级别相关

4、具有非常高效的缓存特性,能缓存索引,也能缓存数据

5、整个表和主键以cluster方式存储,组成一颗平衡树

6、所有secondary index都会保存主键信息

7、支持分区,表空间,类似oracle数据库

8、支持外键约束,不支持全文索引5.5以前。5.5之后支持


InnoDB引擎应用场景

1、需要事务支持的业务(具有较好的事务特性)

2、行级锁定对高并发有很好的适应能力,但是需要确保查询是通过索引完成

3、数据读写以及更新较为频繁的场景,如BBS/SNS/微博、微信等等

4、数据一致性要求较高的业务。如银行转账等

5、硬件设备内存较大,可以利用 InnoDB较好的缓存功能来提供内存利用率,尽可能减少磁盘IO

6、相比 MyISAM引擎,innodb引擎更加消耗资源,速度没有 MyISAM引擎快


InnoDB引擎调优精要

1、主键尽可能小,避免给 Secondary index带来过大的空间负担

2、避免全表扫描,因为全表扫描还是会使用表锁

3、尽可能缓存索引的数据,提高响应速度,减少磁盘IO消耗

4、在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交。有开关可以控制提交方式

5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全

6、避免主键更新,因为这会带来大量数据移动