zoukankan      html  css  js  c++  java
  • 高性能MySQL(七):转换表的存储引擎

    介绍三种方式将表的存储引擎转换成另一种存储引擎:

    1、ALTER TABLE

    最简单的方式就是使用修改表ALTER TABLE语句:

    ALTER TABLE `table_name` ENGINE=InnoDB;

    上述语法可以适用任何存储引擎。但有一个问题:需要执行很长时间。MySQL会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。

    数据存储默认会有一个逐渐索引,采用B树或B+树结构,如果修改表引擎,则需要重构目标引擎的主键索引树。

    另外注意:如果转换表的存储引擎,将会失去和原引擎相关的所有特性。例如,如果将一张InnoDB表转换为MyISAM,然后再转换回InnoDB,原InnoDB表上所有的外键将丢失。

    2、导出与导入

    为了更好地控制转换的过程,可以使用mysqldump工具将数据:

    1. 先导出到文件,
    2. 然后修改文件中CREATE TABLE语句的存储引擎选项

    注意同时修改表名,因为同一个数据库中不能存在相同的表名,即使它们使用的是不同的存储引擎。同时要注意mysqldump默认会自动在CREATE TABLE语句前加上DROP TABLE语句,不注意这一点可能会导致数据丢失。

    3、创建与查询(CREATE和SELECT)

    第三种转换的技术综合了第一种方法的高效和第二种方法的安全。不需要导出整个表的数据,而是先创建一个新的存储引擎的表,然后利用INSERT…SELECT语法来导数据

      CREATE TABLE innodb_table LIKE myisam_table;
      ALTER  TABLE innodb_table ENGINE=InnoDB;
      INSERT INTO innodb_table SELECT * FROM myisam_table;

    数据量不大的话,这样做工作得很好。

    如果数据量很大,则可以考虑做分批处理,针对每一段数据执行事务提交操作,以避免大事务产生过多的undo。假设有主键字段id,重复运行以下语句(最小值x和最大值y进行相应的替换)将数据导入到新表:

      START TRANSACTION;
      INSERT INTO innodb_table SELECT * FROM myisam_table
            WHERE id BETWEEN x AND y;
      COMMIT;

    这样操作完成以后,新表是原表的一个全量复制,原表还在,如果需要可以删除原表。如果有必要,可以在执行的过程中对原表加锁,以确保新表和原表的数据一致。

  • 相关阅读:
    SQL Server 存储过程/触发器中调用COM组件的方法
    写入Stream
    Python 3.2 中adodbapi的问题
    Python中将系统输出显示在PyQt中
    动态创建 Lambda 表达式
    Entity Framework框架Code First Fluent API
    扩展IQueryable实现属性名称排序
    在Entity Framework中使用事务
    ASP.NET MVC:通过FileResult向浏览器发送文件
    ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息
  • 原文地址:https://www.cnblogs.com/liuyiyuan/p/13817047.html
Copyright © 2011-2022 走看看