`

关于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;
分享到:
评论

相关推荐

    MySQL从MyISAM转换成InnoDB错误与常用解决办法

    ### MySQL从MyISAM转换至InnoDB过程中遇到的问题及解决办法 #### 一、问题背景 在使用MySQL的过程中,有时会遇到需要将MyISAM存储引擎的数据表转换为InnoDB的情况。这种转换可能是出于对事务处理的支持、外键约束的...

    MySQL面试必备+Explain的讲解+简单优化+MyISAM、InnoDB存储引擎区别+MySQL为什么选择B+树索引+MySQL中的锁

    对一个支持外间的innodb转换为myisam时会失败 3,innodb不保存表的具体行数,执行 select count(*)from table时会全表扫描,而myisam用一个变量保存了整个表的行数,执行上述语句只需读出该变量的值就行,速度很快...

    myisam和innodb的区别

    在实际应用中,有时需要将表从一种存储引擎转换为另一种。主要有以下几种转换方式: 1. **ALTER TABLE**:使用`ALTER TABLE`语句可以更改表的存储引擎,但此过程会加锁且效率较低。 2. **DUMP & IMPORT**:通过`...

    将MySQL从MyISAM转换成InnoDB错误和解决办法

    ### 将MySQL从MyISAM转换成InnoDB的错误与解决方法 #### 一、问题背景及概述 本文主要探讨了在将MySQL数据库从MyISAM引擎转换为InnoDB引擎时遇到的问题及其解决方法。作者最初使用的是一款仅支持MyISAM引擎的非...

    Mysql存储引擎InnoDB和Myisam的六大区别

    - LOAD TABLE FROM MASTER在InnoDB中无效,需要先将InnoDB表转换为MyISAM,导入后再转换回来,但这可能会丢失InnoDB特有的功能,如外键。 4. **自动ID处理**: - MyISAM为INSERT和UPDATE操作自动更新AUTO_...

    mysql更改引擎(InnoDB,MyISAM)的方法

    - 这种方法可以将MyISAM表转换为InnoDB,或者反之。 4. 查看引擎信息: - 使用`SHOW ENGINES;`命令可以查看服务器支持的所有存储引擎及其特性。 - 要检查特定表的存储引擎,可以运行: ```sql SHOW TABLE ...

    浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    不过,InnoDB需要更多的内存和磁盘空间,转换大型MyISAM表到InnoDB可能会带来挑战。 选择存储引擎时,应考虑以下因素: 1. 事务需求:如果应用需要事务处理,如银行交易或电子商务网站,InnoDB是更好的选择。 2. ...

    MySQL数据库MyISAM存储引擎转为Innodb的方法

    当发现MyISAM存储引擎无法满足需求,需要转换为InnoDB时,可以按照以下步骤进行操作: 1. **导出表结构**: 使用`mysqldump`工具,加上参数`-d`,表示不导出数据,只导出表结构。例如: ``` mysqldump -d -uxxx ...

    MYSQL中 TYPE=MyISAM 错误的解决方法

    本文主要讨论的是关于"TYPE=MyISAM"错误的解决方法,以及与之相关的MySQL存储引擎概念。 在较早版本的MySQL中,创建表时使用`TYPE=MyISAM`来指定使用MyISAM存储引擎。MyISAM是MySQL早期的默认存储引擎,以其快速的...

    Mysql更换MyISAM存储引擎为Innodb的操作记录总结

    要将一个表从MyISAM转换为InnoDB,可以使用以下SQL语句: ```sql ALTER TABLE table_name ENGINE=InnoDB; ``` 这将改变表的存储引擎,并保持现有数据不变。 4. **备份数据**: 在执行任何更改之前,为了防止...

    MySQL InnoDB和MyISAM数据引擎的差别分析

    如果需要使用此操作,可能需要先将InnoDB表转换为MyISAM,但这可能会丢失InnoDB特有的特性,如外键。 总的来说,InnoDB更适合需要事务处理和数据完整性的应用场景,如银行系统、电子商务等;而MyISAM则适用于读取...

    mysql 中InnoDB和MyISAM的区别分析小结

    若想在InnoDB中实现类似功能,可能需要先将表转换为MyISAM,导入数据后再次转换回来,但这可能会丢失InnoDB特有的特性。 总的来说,InnoDB适合需要事务处理、数据完整性和并发性的应用程序,而MyISAM则适用于读取...

    MySQL数据库存储引擎探析.docx

    本文将深入探讨 MySQL 数据库中常用的存储引擎,包括 InnoDB、MyISAM、Memory(HEAP)和 Archive 等。 一、InnoDB 存储引擎 InnoDB 是 MySQL 的默认存储引擎,它提供了强大的事务处理、行级锁定和外键约束功能。...

    深入解析:MySQL存储引擎的奥秘

    例如,将`Employees`表的存储引擎从InnoDB转换为MyISAM的命令如下: ```sql ALTER TABLE Employees ENGINE = MyISAM; ``` #### 八、总结 通过本文的详细介绍,我们深入了解了MySQL存储引擎的重要性以及不同存储...

    探索MySQL的心脏:如何查看当前存储引擎

    - **MyISAM**:这种存储引擎不支持事务处理,采用表级锁定,因此在读取密集型应用中表现出色。 - **MEMORY**:该引擎将所有数据存储在内存中,适用于需要高速访问数据的临时表或缓存。 - **Archive**:主要用于存储...

    mysql中engine=innodb和engine=myisam的区别介绍

    若想将不支持事务的MyISAM表转换为InnoDB,可以使用`ALTER TABLE tablename ENGINE = InnoDB`,数据不会丢失,但请注意,InnoDB表不能使用`REPAIR TABLE`命令或`myisamchk -r`工具,而是需依赖`CHECK TABLE`或`mysql...

    MySQL修改数据表存储引擎的3种方法介绍

    MySQL是世界上最流行的关系型数据库管理系统之一,其灵活性和强大的功能使其在各种应用场景中都有广泛的应用。...了解不同存储引擎的特性以及如何灵活地转换它们,对于优化MySQL数据库的性能至关重要。

    sytcommon.zip

    接下来,一旦数据导入完成,我们可以将表引擎切换回InnoDB。InnoDB是MySQL的默认存储引擎,它支持事务处理、行级锁定以及外键约束,这些都是保证数据完整性和一致性的关键特性。因此,对于需要高并发读写、事务安全...

Global site tag (gtag.js) - Google Analytics