这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
前言: 本篇文章 是我关于MySQL的第17篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章采用MySQL8.0来举例。本篇文章来介绍一下MySQL表存储引擎的转换。
有时候我们在实际使用中因为查询或者写入速度不太满意我们想切换存储引擎,这时候我们需要用到操作来改变表的存储引擎
一. alter table
这种是最简单的方式,只需要一条sql就能执行。
-- 首先查询表存储引擎
show table status like 'food';
Name |Value |
---------------+-------------------+
Name |food |
Engine |MyISAM |
Version |10 |
可以看到目前是MyISAM引擎,现在执行更改命令
-- 执行更改命令
alter table food engine=InnoDB;
再次查询看一下是否改变了
-- 再次查询表存储引擎
show table status like 'food';
Name |Value |
---------------+-------------------+
Name |food |
Engine |InnoDB |
内部逻辑:在执行sql之后,mysql会锁定此表,然后将原表的数据导入到一个新的temp表中。该表的存储引擎就是你更改之后的存储引擎。然后数据导入完成后,将原表删除。再把该temp表改名成你原表的名称。
可能出现的问题:
- 在表数据过多时,该sql执行是比较耗时的。不建议在正在使用此表时执行这条语句。
- 转换之后原存储引擎的特性会消失,如果你的InnoDB存储引擎的表要转换为MyISAM或者其他不支持外键的表,那么你的外键会全部消息。就算重新转回InnoDB,也不能将其恢复。所以在需要保留的特性时,要考虑清楚是否要进行转换。
二. 手动执行导入导出。
将alter table帮我们做的事情,我们自己来实现。手动导出数据到临时表中,然后删除原表,将存储表名称更改为原表的名称。利用工具的话,导入导出会更快一些。并且不会加锁。
三. 创建新表,通过执行SQL的方式来进行插入
-- 复制原表到新表
CREATE table innodb_food like food;
-- 更改存储引擎
alter table innodb_food engine=innoDB;
-- 将原表数据插入到新表中
INSERT into innodb_food select * from food;
在数据量多的情况下,插入语句会执行的比较慢。可以分批插入。
四,第三方工具
现在有很多第三方工具提供这样的功能,便捷且快速。并且防止我们误操作。
参考文档
《高性能MySQL》