MyISAM 迁移至 InnoDB方案
时间:2022-07-23
本文章向大家介绍MyISAM 迁移至 InnoDB方案,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 迁移前须知
1.1 MyISAM 和 InnoDB内存需求
- 减少key_buffer_size参数大小
- innodb_buffer_pool_size参数大小
- 关闭查询缓存
1.2 处理长事务和短事务
因为MyISAM不支持事务,所以当转化为InnoDB需要注意事务相关的参数影响
- 当在交互界面处理事务时,请确保在结束时commit或rollbacks事务
- 请确保开发的应用在结束时commit事务,并且可以在异常时rollback事务
- 减少大数据量的回滚,因为回滚是个高消耗的动作
- 如果需要使用INSERT插入大量的数据,请批量进行commit,而不是最后提交一次,若发生错误需回滚,请使用truncate而不是rollback
- 如果有大量的连续的DML操作,考虑设置autocommit=0,这样可减少I/O消耗并且可在错误时及时回滚
- 在跑报表等长时间的SQL时,可以设置autocommit=1,这是默认值
1.3 处理死锁
在InnoDB中我们可能会遇到死锁,一般情况下我们对于死锁无需关注,MySQL会自己处理,不过如果我们在error日志中发现大量的死锁,就需要我们检查应用并进行相应的处理
1.4 计划存储规划
- InnoDB比MyISAM消耗更多的磁盘空间
- 设置innodb_file_per_table参数开启独立表空间(5.6开始为默认值)
- 设置innodb_file_format参数为Barracuda以支持表压缩等特性
1.5 InnoDB表主键规范
我们可以根据如下规范来操作
- 对于每张表必须要一个主键,用来提高查询效率,注意主键不要频繁的修改
- 在建表语句中定义主键,而不是后面使用alter table来定义
- 慎重确定字段类型,数字类型最优先,其次再是字符类型
- 如果没有主键可定义,可使用自增列来定义主键,根据表的数据量来决定自增列的最小类型
- 如果表中主键是长的数据类型,例如varchar,考虑新增一个无符号的自增列作为主键,并将原主键转换为UNIQUE NOT NULL索引
- 最好使用可以用来和别的表关联的列做主键
- 如果我们建表不定义主键,MySQL会默认建立一个隐藏自增主键,不过他说6字节的,可能会造成空间浪费,而且不能用于查询
2. 如何转换
2.1 直接转换
我们可以使用如下命令直接转换
ALTER TABLE table_name ENGINE=InnoDB;
注意不要转换mysql数据库的系统表,否则将导致数据库无法启动
2.2 克隆方式
我们也可以通过克隆的方式来进行
首先新建一个结构相同的InnoDB表
使用如下命令查看原表结构
SHOW CREATE TABLE table_nameG
注意将ENGINE=MyISAM改成ENGINE=INNODB
之后使用如下语句导入数据
INSERT INTO innodb_table SELECT * FROM myisam_table ORDER BY primary_key_columns
导入后将克隆的表重命名为原表
提速措施
- 增加InnoDB内存到物理内存的80%
- 增加InnoDB的日志文件
- 我们可以先导入数据再建索引
- 可暂时禁用唯一约束来提高速度,但要保证导入数据的唯一性
- 如果数据很大,我们可采取分批导入的方式一次只导入一部分数据
3. 注意事项
- 请保留2倍的空间用来转换,如果空间不够则会回滚,并且会非常慢
- 注意不要删除 ibdata文件
4. 参考链接
https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html
- 通过shell解析dump生成parfile(r2笔记76天)
- Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")
- 如何用R语言从网上读取多样格式数据
- C/C++——生成随机数
- PHP基础——PHP数组
- 使用shell抽取html数据之二(r2笔记75天)
- Python爬取链家网数据:新房楼盘价格分析
- 【编程基础】Java里面如何对字符串排序?
- 计算广告——广告定向实践
- 通过shell抓取html数据(r2笔记74天)
- 通过shell脚本分析足彩(r2笔记74天)
- 通过shell脚本得到数据字典的信息 (r2笔记72天)
- 机器学习算法实践——K-Means算法与图像分割
- 利用 Python、SciKit 和文本分类来构建客户行为描述模型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用ES5,ES6和SAP ABAP实现非波拉契数列Fibonacci
- SpringBoot整合自定义注解
- nginx被动检测
- Python获取股票历史数据
- 实习第四周
- 浅谈推进有赞全站 HTTPS 项目-工程篇
- Checks autowiring problems in a bean class问题解决
- 有赞权限系统
- python处理txt文件常用方法
- 修改springboot运行时命令行Banner
- 适应性页面自己的看法
- Vant 1.0 正式发布:轻量、可靠的移动端 Vue 组件库
- SAP CDS view单元测试框架Test Double介绍
- 漫谈 React 组件库开发(二):组件库最佳实践
- 搭建简易的物联网服务端和客户端-移动家庭能力平台【1】(二十三)