mysql 修改表的engine_mysql修改表的存储引擎(myisam<=>innodb)

本文介绍了两种在MySQL中修改表的存储引擎的方法,从MyISAM转换为InnoDB,包括直接修改和使用中间表。在大数据量下,通过中间表的方式可以提高效率,但可能需要分批操作。此外,提供了批量更改存储引擎的SQL语句,并建议根据系统配置调整相关参数以加速变更过程。
摘要由CSDN通过智能技术生成

修改表的存储引擎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

方法二:

把方法一中的存储引擎改回myisammysql>

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值