Mysql的存储引擎

在文件系中,Mysql将每个数据库(也可称为schema)保存为数据目录下的子目录。创建表时,Mysql会在数据子目录下创建一个和表名相同的.frm文件保存表的定义。可以使用SHOW TABLE STATUS 命令查看表的信息。

SHOW TABLE STATUS LIKE "USER"/G

InnoDB存储引擎

InnoDB是Mysql默认的存储引擎,也是最重要、使用最广泛的存储引擎。他在处理大量短期事务上表现出众,短期事务大部分都是正常提交的,很少被回滚。InnoDB的性能和自动崩溃恢复特性,使得他在非事务型存储的需求中也很流行。

Mysql5.1中发布了InnoDB plugin,支持一些新特性,诸如利用排序创建索引、删除或者增加索引时不需要创建全表数据、新的支持压缩的存储格式、新的大型列值如BLOB的存储方式,以及文件格式管理等。在过去的几年内,InnoDB的改进速度大大加快,主要的改进集中在可测量性、可扩展性、可配置性、性能、各种新特性和对Windows的支持

InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,有一系列的数据文件组成。而且InnoDB可以将每个表的数据和索引放在单独的文件中。

InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPETABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询设计的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

InnoDB表是基于聚簇索引建立的,这个索引结构和Mysql的其他存储引擎有很大不同,聚簇索引对主键查询有很高的性能。不过他的二级索引中必须包含主键列,所以如果主键很大的话,其他索引都很大。

InnoDB内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够在内存中创建hash索引以加速读操作的自适应哈希索引,以及能够加速插入的插入缓冲区。

作为事务型的存储引擎,InnoDB通过一些机制和工具支持真正的热备份,Oracle提供的Mysql Enterprise Backup、percona提供的开源的XtraBackup都可以做到这一点。

MyISAM存储引擎

在Mysql5.1及之前的版本中,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,旦MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复

对于只读的数据,或者表表较小,可以忍受修复操作,则依然可以使用MyISAM。

MyISAM会将表存储在俩个文件中:数据文件和索引文件,分别以.MYDhe .MYI为扩展名。

所有的Mysql版本都支持8字节的指针。要改变MyISAM表指针的长度,可以通过修改表的MAX_ROWS和AVG_ROW_LENGTH的值来实现。两者相乘就是表可能达到的最大大小。修改这两个值可能导致重建表和标的所有索引,这可能需要很长的时间才能完成。

加锁与并发:MyISAM会对整张表加锁。在表有读取查询的同时,也可以往表中插入新的记录。

修复:对于MyISAM表,Mysql可以手动或者自动执行检查和修复操作。可以通过CHECK_TABLE mytable检查表的错误,如果有错误可以通过执行REPAIR TABLE mytable进行修复。

索引特性:MyISAM支持全文索引,这是一种基于分词创建的索引,可以支持复杂的索引。

延迟更新索引:创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成之前,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的缓冲区,只有在清理缓冲区或者关闭表的时候才会将对应的索引写入磁盘。

MyISAM压缩表:如果表在创建或者导入数据后,不会再进行修改操作,那么这样的表适合使用MyISAM压缩表。压缩表是不能进行修改的(除非将表解压缩,修改数据,然后再压缩)。压缩表对减少I/O带来的好处很大,对读取带来的开销影响并不大。

MyISAM性能:MyISAM设计简单,数据以加密格式存储,所以某些场景下的性能很好。旦MyISAM最典型的性能还是表锁的问题,如果你发现所有的查询都长期处于“LOCKED”状态,那么毫无疑问表锁就是罪魁祸首。

选择合适的引擎

除非用到某些InnoDB不具备的特性,并且没有其他方法可以替代,否则优先选择InnoDB存储引擎。

广告


JackSun

JackSun

I'm a coder.

You may also like...

Leave a Reply

Your email address will not be published.