Mysql专题一:引擎_MySQL
InnoDB 存储引擎
innoDB是mysql的默认事务型引擎,也是最重要,使用最广泛的存储引擎。它被设计来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。innodb的性能和自动崩溃回复特性,使得它在非事务型存储的需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑innodb存储引擎
innodb的数据存储在表空间中,表空间是由innodb管理的一个黑盒子,由一系列的数据文件组成。在mysql4.1以后的版本中,innodb可以将每个表的数据和索引存放在单独的文件中。innodb也可以使用裸设备作为表空间的存储介质,但现代的文件系统使得裸设备不再是必要选择。
innodb采用mvcc来支持高并发,并且实现了四个标准的隔离级别。其默认级别是repeatable read(可重复度),并且通过间隙锁策略防止幻读的出现。间隙锁使得innodb不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入
innodb 表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能。不过它的二级索引中必须包含主键列,所以如果主键列很大的话,其他的索引都会很大
MyISAM 存储引擎
在mysql 5.1及之前的版本,myisam是默认的存储引擎。myisam提供了大量的特性,包括全文索引,压缩,空间函数(GIS)等,但myisam不支持事务和行级锁且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。正是由于myisam引擎的缘故,即使mysql支持事务已经很长时间了,在很多人的概念中mysql还是非事务性的数据库。尽管myisam引擎不支持事务,不支持崩溃后的安全回复,但它绝不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以继续使用myisam。
myisam会将表存储在两个文件中:数据文件和索引文件,分别以.myd和.myi为拓展名。myisam表可以包含动态或者静态长度固定的行。mysql会根据表的定义来决定采用何种行格式。myisam表可以存储的行记录数,一般受限于可用磁盘控件,或者操作系统中单个文件的最大尺寸。
myisam对整张表进行加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁。但是在表有读取查询的时候,也可以往表中插入新的记录,这被称为并发插入。
对与myisam表,mysql可以手工或者自动执行检查和修复操作,但这里说的修复和事务回复以及崩溃恢复是不同的概念。执行表的修复可能导致一些数据丢失,而且修复操作是非常慢的。可以通过check table mytable检查表的错误,如果有错误可以通过执行repair table mytable进行修复。另外,如果mysql服务器已经关闭,可以通过myisamchk命令行工具进行检查和修复操作。
对于myisam表,即使是blob和text等长字段,也可以基于其前500个字符创建索引,myisam也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。
创建myisam表的时候,如果指定了delay_key_write选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。这种方式可以极大的提升写入性能,但是在数据或者主机崩溃时会造成索引损坏,需要执行修复操作。延迟更新索引的操作,可以在全局设置,也可以为单个表设置