MySQL插件式存储引擎的体系结构
1.MyISAM的介绍
1.1什么是MyISAM引擎?
MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
范例:
mysql> use oldboy;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> show create table test \G;
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
-rw-rw—-. 1 mysql mysql 8556 Nov 3 19:04 test.frm
-rw-rw—-. 1 mysql mysql 0 Nov 3 19:04 test.MYD
-rw-rw—-. 1 mysql mysql 1024 Nov 3 19:04 test.MYI
1.2MyISAM的引擎特点
1)不支持事务
什么是事务?我个人的理解就是,就是所有的事情都必须每一件同时完成,才可以前进,因为mysql早期不支持事务,所以bank用oracle
2)表级锁定(更新时锁定整个表):其锁定机制是表级索引,这样可以让锁定的实现成本很小,但同时会降低其并发性能:
比如,当要给一张表的第10行更新数据,这个时候整个表会被锁定,要更新这个表的其他行,必须等第10行更新完成后,才可以进行
3)读写互相阻塞,在写的时候,不能读取;在读取的时候,不能写
4)只会缓存索引,通过key_buffer_size,可以大大提高缓存性能,减少磁盘IO,但是它只能缓存索引,而不能缓存数据
[root@mysql oldboy]# grep key_buffer /etc/my.cnf
key_buffer_size = 16K
数据肯定是比索引多,所以只缓存索引,其效率很低
5)读取速度快,暂用资源相对较少
6)支持全文索引,但不支持外键约束
7)它是mysql的默认引擎
1.4 MyISAM适用的生产场景
1)不需要事务支持的业务,一般为读数据比较多的的应用
2)并发相对较低的业务(锁定机制的问题)
3)数据修改相对较少的业务(阻塞的问题)
4)以读为主的业务,比如www,blog,图片等数据库业务
5)对数据一致性要求不是非常高的的业务,比如bank
1.5 MyISAM引擎调优精要
1)尽量索引(缓存机制)
2)调整读写优先级,根据实际需求确保重要操作更优先
3)启用延迟插入,改善大批量写入性能
4)尽量顺序操作,让insert数据都写入到尾部,减少阻塞
5)分解大的操作,降低单个操作的阻塞时间
6)降低并发数,某些高并发场景应用进行排队机制
7)对于相对静态数据,充分利用Query Cache或memcache
8)MyISAM的count只有在全表扫描的时候特别高效,带有其他条件的count需要进行实际的数据访问
2.什么是InnoDB引擎?
InnoDB引擎是Mysql的另一个引擎,正被成为mysql AB所发行的标准,被包含在所有二进制安装包里。较之于其他的存储引擎,它的优点是支持兼容ACID事务(类似postgreSQL,)以及参数完整性(即对外键的支持)。Oracle公司与2005年10月收购了Innobase。Innobase采用双认证授权。他使用GUN发行,也允许其它想将Inonodb结合到商业软件团体获得授权
2.1 innoDB的引擎特点
1)支持事务(transaction):
支持4个事务隔离级别,支持多版本读
2)行级锁定(Row Locking granularity):
更新的时候一般是锁定当前行,通过索引实现,全表扫描认识表锁,注意间隙锁的影响
3)读写阻塞与事务隔离界别有关
4)具有很高效的缓存特性:即能缓存索引,也能缓存数据
5)整个表和主键以cluster方式存储,组成一颗平衡树
6)所有secondary index都会保存主键信息
7)支持分区,表空间
8)支持外键约束,不支持全文索引
2.2 innoDB的引擎适用的生产环境
1)需要事务支持(具有较好的事务特性)
2)行级锁定对高并发有很好的适用能力,但需要确保查询是通过索引完成
3)数据更行较为频繁的场景如,bbs,sns
4)数据一致性要求高的业务
5)硬件设备内存比较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能降低IO
[root@mysql ~]# grep -i innodb /etc/my.cnf
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /usr/local/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql/data
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
2.2 innoDB的引擎调优精要
1)主键尽可能小,避免给Secondary index带来过大的空间负担
2)避免全表扫描,因为会使用表锁
3)尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗
4)在大批量小插入的时候,尽量自己控制事务而不使用autocommit自动提交
5)合理设置innodb_flush_log_at_trx_commit参数,不要追求过度安全性
6)避免主键更新,因为这会带来大量的数据移动