mysql更改表引擎INNODB为MyISAM的方法总结

本文介绍了MySQL数据库中INNODB和MyISAM两种表存储引擎的特点及应用场景,并详细讲解了如何通过SQL语句将INNODB引擎转换为MyISAM引擎的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql数据库分类为INNODB为MyISAM两种表存储引擎了,两种各有优化在不同类型网站可能选择不同,下面小编为各位介绍mysql更改表引擎INNODB为MyISAM技巧。

常见的mysql表引擎有INNODB和MyISAM,主要的区别是INNODB适合频繁写数据库操作,MyISAM适合读取数据库的情况多一点,如何把表引擎INNODB更改为MyISAM呢?

使用以下mysql sql语句,可以给表设定数据库引擎:

ALTER TABLE `wp_posts` ENGINE = MyISAM;

在需要使用mysql的全文索引(FULLTEXT index)的时候,这张表的数据库引擎必须是MyISAM类型。关于INNODB为MyISAM数据库引擎有什么具体区别

例子

修改表的存储引擎myisam<=>innodb
 
查看表的存储引擎
mysql> show create table tt7;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| tt7   | CREATE TABLE `tt7` (
  `id` int(10) default NULL,
  `name` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
查看表的数据量
mysql> select count(1) from tt7;
+----------+
| count(1) |
+----------+
| 16777216 | 
+----------+
1 row in set (0.00 sec)
 
方法一:

直接更改存储引擎
mysql> alter table tt7 engine=innodb;
Query OK, 16777216 rows affected (2 min 39.80 sec)
Records: 16777216  Duplicates: 0  Warnings: 0

方法二:
 
把方法一中的存储引擎改回myisam
mysql> alter table tt7 engine=myisam;
Query OK, 16777216 rows affected (27.09 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
从这里也可以看出myisam表要比innodb表快很多
 
创建个和tt7同样表结构的表
mysql> create table tt7_tmp like tt7;
Query OK, 0 rows affected (0.02 sec)
 
tt7_tmp作为中间结果集
mysql> insert into tt7_tmp select * from tt7;
Query OK, 16777216 rows affected (27.20 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
 
删除原表的数据
mysql> truncate table tt7;
Query OK, 16777725 rows affected (0.18 sec)
 
这回更改原表的存储引擎
mysql> alter table tt7 engine=innodb;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
速度很快就完成了
 
再把中间结果集的数据导回原表中
mysql> insert into tt7 select * from tt7_tmp;
Query OK, 16777216 rows affected (2 min 0.95 sec)
Records: 16777216  Duplicates: 0  Warnings: 0
 
删除中间表
mysql> drop table tt7_tmp;

测试结果:

方法二比较快一点,但是数据量要是比较大的话,方法二就要采用化整为零的分批操作的方式,否则insert操作将会具耗时,并产生大量的undo日志。
如果是小表的话(500M以内,根据自己系统的硬件环境),采用方法一就可以
如果是大表的话,那就采用方法二+批量的方式

如果是批量更改表的存储引擎

用于生成变更的SQL语句:

SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema='db_name' AND ENGINE='myisam';

用于生成检查表的SQL语句:

SELECT CONCAT('CHECK TABLE ',table_name) FROM information_schema.tables WHERE table_schema='db_name';

根据自己系统配置修改如下参数,以加快变更速度(记得以前的值,一会还得改回来)

SET GLOBAL sort_buffer_size=64*1024*1024;
SET GLOBAL tmp_table_size=64*1024*1024;
SET GLOBAL read_buffer_size=32*1024*1024;
SET GLOBAL read_rnd_buffer_size=32*1024*1024;

MYSQL中myisam和innodb引擎的区别

MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。

讲讲你对mysql myisam和innodb的认识。然后你认为他们的区别在那里?为什么?

答:这两个是MySQL主要存储引擎。

简要介绍来自官网。

简要介绍:myIsam

myIdam是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL5.1不支持ISAM)。

每个myisam在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD(MYData)。索引文件的扩展名是.MYI(MYIndex)。

简要介绍:InnoDB

InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。

InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。

InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在myisam表中每个表被存在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。

InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。

简单概括几点如下:

1.  通过以上不难看出,myIsam InnoDB的用途,myisam主要适用于中小型数据量。InnoDB引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[magento]就是采用InnoDB创建。

2.  myIsam写入速度比InnoDB快。

3.  在使用InnoDB时候需要对my.cnf进行配置以保证MySQL达到最大效率。详细可以查看官网[inndo性能调节]:
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。

其中有很多人在网上发表了关于mysql myIdam和InnoDB在存贮和读取方面的差异。暂时还没有做过度研究。

基本测试都是基于使用[事务]和不使用[事务],进行对比。MySQL对于[非事务表]速度会比较块。

<think>我们面对的任务是批量修改MySQL数据库中多个的存储引擎为InnoDB方法一:使用ALTER TABLE语句逐个修改,但效率低。 方法二:生成并执行批量修改的SQL脚本。 步骤: 1. 生成需要修改的。我们可以通过查询information_schema数据库来获取当前数据库(或指定数据库)中所有非InnoDB引擎的。 2. 为每个生成一个ALTER TABLE语句,并将这些语句保存到一个SQL脚本中。 3. 执行这个SQL脚本。 具体操作: 步骤1:查询非InnoDB引擎的 假设我们要修改的数据库名为`your_database_name`,则查询语句如下: ```sql SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND ENGINE <> 'InnoDB'; ``` 注意:这里我们排除了已经是InnoDB引擎的。 步骤2:生成修改脚本 我们可以使用GROUP_CONCAT(在MySQL中)或者使用编程方式(如使用脚本语言)来生成多个ALTER TABLE语句。 但是,如果很多,我们可以用以下方式在MySQL中生成一个包含所有ALTER语句的SQL文件: 方法A:使用SQL生成语句并输出到文件 ```sql SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND ENGINE <> 'InnoDB' INTO OUTFILE '/path/to/alter_engine.sql'; ``` 注意:使用INTO OUTFILE需要MySQL有文件写入权限,且文件路径必须是MySQL服务端可写的。 方法B:在命令行中使用批处理 我们也可以在命令行中使用mysql命令结合sed或awk来生成并执行: ```bash mysql -u username -p -e "SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='your_database_name' AND ENGINE <> 'InnoDB'" | grep 'ALTER' > alter_engine.sql ``` 然后,我们可以检查生成的alter_engine.sql文件,确认无误后执行: ```bash mysql -u username -p your_database_name < alter_engine.sql ``` 方法C:使用存储过程(不推荐,因为需要创建和删除存储过程,且可能涉及权限) 步骤3:执行生成的SQL文件 如上所示,使用mysql命令行客户端执行生成的SQL文件。 注意事项: 1. 在修改之前,请确保备份数据库,因为修改存储引擎可能会影响数据(特别是从MyISAM转到InnoDB,两种引擎的索引结构不同,锁和行锁的区别等)。 2. 修改过程中会锁,所以请在业务低峰期操作。 3. 检查是否有使用了InnoDB不支持的特性(如MyISAM的全文本索引,在InnoDB中从MySQL5.6开始支持,但如果是更早的版本则不支持)。 4. 如果很大,修改可能需要较长时间。 另外,如果数据库中有视图,则不需要修改,因为视图没有存储引擎的概念。 因此,批量修改的步骤如下: 1. 备份数据库。 2. 生成修改脚本(如上所述)。 3. 执行修改脚本。 下面是一个完整的示例(假设数据库名为mydb): 生成脚本文件: ```sql mysql -u root -p -e "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ENGINE=InnoDB;') AS sql_stmt FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb' AND ENGINE <> 'InnoDB' AND TABLE_TYPE='BASE TABLE'" > alter_engine.sql ``` 然后检查alter_engine.sql文件,再执行: ```bash mysql -u root -p mydb < alter_engine.sql ``` 注意:这里我们过滤了TABLE_TYPE='BASE TABLE',因为information_schema.TABLES中还包括视图(VIEW),而视图不需要修改存储引擎。 如果中包含外键约束,在修改存储引擎之前,需要确保外键约束在InnoDB中能够正确工作(InnoDB支持外键,而MyISAM不支持)。如果从MyISAM转到InnoDB,那么之前没有检查的外键约束现在会被InnoDB强制执行,所以需要确保数据满足外键约束。 另外,如果从MyISAM转换到InnoDB,原有的FULLTEXT索引MySQL5.6之前是不支持的,需要删除全文索引或者升级MySQL版本。在MySQL5.6及以上版本,InnoDB支持全文索引。 因此,在转换之前,最好检查一下结构,特别是索引部分。 总结:批量修改MySQL的存储引擎为InnoDB,核心是生成并执行一组ALTER TABLE语句。通过查询information_schema.TABLES获取非InnoDB引擎的,然后为每个生成ALTER TABLE语句并执行。 相关问题: 1. 如何检查MySQL的当前存储引擎? 2. 将MyISAM转换为InnoDB需要注意哪些问题? 3. 如何批量修改MySQL数据库中的所有的主键? 4. 在修改存储引擎时,如何避免长时间锁? 5. MySQLInnoDBMyISAM存储引擎的主要区别是什么?</think>### 批量修改MySQL存储引擎为InnoDB方法 #### 方法一:使用SQL脚本生成器(推荐) ```sql -- 步骤1:生成批量修改语句 SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=InnoDB;') AS sql_statement FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND ENGINE <> 'InnoDB' -- 排除已是InnoDB AND TABLE_TYPE = 'BASE TABLE'; -- 仅处理普通 -- 步骤2:执行生成的SQL -- 将上一步的输出结果复制执行 ``` #### 方法二:命令行批量操作 ```bash # 生成并直接执行修改命令 mysql -u用户名 -p密码 -Nse \ "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ENGINE=InnoDB;') \ FROM information_schema.TABLES \ WHERE TABLE_SCHEMA = '你的数据库名' \ AND ENGINE != 'InnoDB'" | \ mysql -u用户名 -p密码 你的数据库名 ``` #### 方法三:存储过程批量修改 ```sql DELIMITER $$ CREATE PROCEDURE convert_to_innodb() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tbl_name VARCHAR(255); DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ENGINE != 'InnoDB'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; convert_loop: LOOP FETCH cur INTO tbl_name; IF done THEN LEAVE convert_loop; END IF; SET @sql = CONCAT('ALTER TABLE ', tbl_name, ' ENGINE=InnoDB'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; END$$ DELIMITER ; -- 执行存储过程 CALL convert_to_innodb(); ``` ### 注意事项 1. **权限要求**:需要`ALTER`权限和`information_schema`查询权限 2. **备份优先**:操作前务必备份数据库 3. **锁影响**:大转换可能长时间锁,建议在低峰期操作 4. **外键约束**:InnoDB强制外键约束,转换前需确保数据一致性 5. **特殊索引**:MyISAM的`FULLTEXT`索引需转换为InnoDB格式(MySQL 5.6+支持) 6. **系统**:不要修改`mysql`系统库中的 ### 验证转换结果 ```sql -- 检查非InnoDB SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND ENGINE <> 'InnoDB'; ``` > **重要提示**:从MyISAM转换到InnoDB时,空间管理方式会改变(.frm/.MYD → 系统空间/独立空间),建议转换后运行`OPTIMIZE TABLE`重组数据[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值