zoukankan      html  css  js  c++  java
  • Mysql转换表存储引擎的三种方式

      或许会有一些场景需要改变表的存储引擎,例如存储日志的表如果几乎只有insert和少量的select操作,为了追求更好的插入性能有可能会需要把存储引擎更换为MyISAM。但是,本文不建议在同一个数据库中混合使用不同的存储引擎。

    1.ALTER TABLE

      将表从一个存储引擎修改为另一种存储引擎最简单的方式是执行DDL语句,下面语句将mytable的引擎有InnoDB改为MyISAM:

        mysql>ALTER TABLE table_name ENGINE=MyISAM ;

      执行效果如下图:

        

      这种修改方法试用与任何存储引擎,但是需要注意的是:如果表的数据量很大,执行的时间会很长,Mysql会将原表的数据复制到一张新表中,在复制的期间可能会消耗完所有的系统I/O能力,同时会对原表上加读锁。同时更换存储引擎后的新表将丢失旧的存储引擎一切特性,例如InnoDB转换为MyISAM之后,所有的外键将丢失。

    2.导出与导入

      为了更好的控制转换过程,可以使用mysqldump工具将数据导出到文件,然后手动的修改文件CREATE TABLE 语句的存储引擎选项ENGINE,注意同时修改表名,因为同一个数据库中不能存在相同的表名,还要注意的是,mysqldump中会默认在CREATE TABLE 前加上DROP TABLE 语句,不注意这一点可能会导致数据丢失。

    3.CREATE 和 SELECT 

      这种方式相对于前面两种高效和安全的特点。不需要导出整个表的数据,而是创建一张新的表,然后通过INSERT .....SELECT 语法来导入数据。

      

      

      

      如果数据量不大的话,上面操作处理结果很令人满意。如果数据量很大,可以分批操作,针对每一段数据执行事务提交,避免大事务带来的问题,例如可以根据时间筛选或者根据id大小筛选分段提交。

        START TRANSACTION;  

        INSERT INTO innodb_table SELECT * FROM mytable where id between x AND y (或者create_time之类); 

        COMMIT;

  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/dquery/p/7112529.html
Copyright © 2011-2022 走看看