关于MyISAM 以及如何转换表的引擎

MyISAM

最大的特点:

不支持事务,不支持崩溃后的安全修复

存储结构:
数据文件(.MYD),索引文件(.MYI)和结构文件(.frm)

加锁与并发
加锁:对整张表进行加锁,而不是行。
并发:在读数据的时候,所有的表上都可以获得共享锁(读锁),每个连接都不互相干扰。
在写数据的时候,获得排他锁,会把整个表进行加锁,而其他的连接请求(读,写请求)都处于等待中。


在读取查询的同时,可以往表中插入新的记录,成为并发插入。


修复
通过check table mytable来检查表的错误。 通过repair table mytable来进行修复


索引
对于blob和text等长字段,可以基于前500个字符建立索引。也支持全文索引,是一种基于分词的索引


延迟更新索引
MYISAM 默认把DELAY_KEY_WRITE开启, 整个选项是MYISAM引擎独有的。
在查询结束后,不会将索引的改变数据写入磁盘,而是改变内存中的索引数据。只有在清理缓冲区或关闭表时才将索引块转储到磁盘。

压缩表

可以通过myisampack对myisam表进行压缩。压缩表是不能进行修改。

可以减少磁盘空间占用,减少磁盘IO,从而提升查询性能。压缩表也支持索引,但是索引也是可读的



转换表的引擎的三种方式

ALTER TABLE

mysql > ALTER TABLE mytable ENGINE=InnoDB;

这种语法适合所有引擎,但是转换过程会耗费大量时间。mysql为此要执行一个旧表到新表的逐行复制。在这期间,转换操作可能会占用服务器的所有I/O处理能力,并且在转换时,源表要被读加锁。因此,在一个繁忙的表上做此操作,要加以注意。
如果从一种引擎到另一种引擎做表转换,所有属于原始引擎的专用特性都会丢失。例如,将一个InnoDB表转换成MyISAM表,再转换回来,最初定义在原InnoDB表上的所有外键都会丢失。

转储(Dump)和导入(Import)

如果想对表转换的过程做更多控制,可以选择使用mysqldump工具,将表先转储成一个文本文件,然后再编辑转储文件,修改其中的CREATE TABLE语句。一定要注意修改表名和引擎类型,因为即使引擎类型有所不同,同一数据库也不允许存在相同表名的两张表。另外,mysqldump在CREATE TABLE语句之前,会默默地加上DROP TABLE命令,如果不注意,很可能丢失原有数据。

CREATE 和 SELECT

此方法在前两种方法之间做了一个平衡,它不转储整张表,或者一次性转换所有数据,而是创建一个新表,使用mysql的INSERT ... SELECT语法来转移数据。
如下:
mysql > CREATE TABLE innodb_table like myisam_table;
mysql > ALTER TABLE innodb_table ENGINE=InnoDB;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table;

如果数据量不大,这种办法效果不错,但是更高效的办法是增量地填充表,在填充每个增量数据块的时候都提交事务,这样就不会导致撤销日志变得过于庞大。假定id是主键,可以重复运行下列查询(每次逐次增大x和y的值),直至所有的数据都复制到新表。
mysql > START TRANSACTION;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql > COMMIT;

猜你喜欢

转载自iamh.iteye.com/blog/2289774