zoukankan      html  css  js  c++  java
  • 14.10.1 Overview of Online DDL

    14.10 InnoDB and Online DDL

    14.10.1 Overview of Online DDL
    14.10.2 Performance and Concurrency Considerations for Online DDL
    14.10.3 SQL Syntax for Online DDL
    14.10.4 Combining or Separating DDL Statements
    14.10.5 Examples of Online DDL
    14.10.6 Implementation Details of Online DDL
    14.10.7 How Crash Recovery Works with Online DDL
    14.10.8 Online DDL for Partitioned InnoDB Tables
    14.10.9 Limitations of Online DDL

    在线DDL 功能 创建InnoDB 快速索引创建功能在MySQL 5.1 and MySQL 5.5.可用。

    InnoDB 快速index 创建功能优化了 CREATE INDEX and DROP INDEX to 来避免table-copying 行为。

    在线DDL 功能,在MySQL 5.6被介绍 加强了很多其他ALTER TABLE操作的类型 来避免表复制,避免DML操作

    当DDL 是处理过程中。

    在线DDL 功能有下面的好处:

    1. 它提高了响应性和可用性在繁忙的生产环境, 让一个表不可用几分钟或者几个小时 当你修改它的indexes或者列定义是不实际的,

    2.
    让你调整在性能和并发在DDL操作之间,通过选择是否阻止访问整个表(LOCK=EXCLUSIVE clause),

    允许查询不能DML (LOCK=SHARED clause), 或者运行查询和DMLL访问 (LOCK=NONE clause).

    当你忽略LOCK子句或者指定 LOCK=DEFAULT,MySQL允许尽可能多的并发根据你的操作的类型。

    在可能的情况下进行改变,而不是创建一个表的新的copy,避免临时增加磁盘空间和I/O增加随着复制表和重构 secondary indexes.

    MySQL Cluster NDB 存储引擎也支持在线table schema 改变, 但是使用它自己的语法

    14.10.1 Overview of Online DDL 在线DDL的概述

    从历史上看,很多的DDL操作在InnoDB 表是昂贵的, 很多的ALTER TABLE操作通过所需表和索引的选项来创建一个新的,

    空的表
    ,然后复制存在的记录到新创建的表,更新索引当记录插进后。 在从原始的表复制所有的记录,

    老的表被删除和复制的被重命名为原始表的名字

    在MySQL 5.5, MySQL 5.1 使用InnoDB插件,优化创建索引和DROP INDEX 来避免表复制行为。

    这个功能被称为Fast index 创建。MySQL 5.6加强很多ALTER TABLE操作的其他类型来避免copy 表。

    另外的增强允许SELECT 查询和INSERT,UPDATE,DELETE(DML) 语句来处理当 表被改变,

    这种组合的特点是被称为在线DDL。

    这种机制意味着你可以加速创建和加载表的整个过程和相关的索引通过创建表没有任何的secondary indexes,

    增加 secondary indexes 在数据被加载后。

    尽管没有语法改变是需要在CREATE INDEX或者DROP INDEX 命令,一些因素会影响性能,空间管理和操作语义。

    在线DDL 在MySQL 5.6加强改进了很多DDL 操作,原来需要复制表,

    阻塞 表上的DML操作。

    ALTER TABLE 分区语句是个例外, 在线DDL 操作对于InnoDB 分区表遵循和InnoDB表相同的规则。

    1. “In-Place?” 列显示哪些操作允许 ALGORITHM=INPLACE 子句,首选值是YES

    2. “Copies Table?” 列显示哪些操作可以避免昂贵的表复制操作, 首选值是NO

    这个列是 “In-Place?” 的反向列,除了一些小的操作允许ALGORITHM=INPLACE 但是仍旧涉及表复制的总量。

    允许并行DML, 列显示哪些操作可以全部在线执行,首选值是YES.

    你可以指定LOCK=NONE 维护完整的并发 在DDL允许,

    但是MySQL 自动允许这个级别的并发,当并发DML 是被允许,并发的查询也被允许。

    允许的并发查询 列允许DDL操作允许表上的查询 ,当操作是在处理, 首选值是YES.

    并发的查询在DDL操作期间是允许的

    Notes列 解释很多的列出 的 “Yes/No” 对于其他的列,

    答案取决于配置选项的设置或者一些其他的DDL子句。 值 “Yes*” and “No*” 表明安全依赖额外的notes.

    下面的章节显示一本的语法,和在线DDL的注意事项, 对于每个主要的操作可以进行并发DML,

    Secondary Indexes

    1.创建一个secondary indexes: CREATE INDEX name ON table (col_list) or ALTER TABLE table ADD INDEX name (col_list). (Creating a FULLTEXT index still requires locking the table.)

    1. DROP secondary indexes: DROP INDEX NAME ON TABLE,或者 ALTER TABLE table DROP INDEX name

    创建和删除 secondary indexes 在InnoDB 表跳过table-copying 行为

    在MySQL 5.6和更高的版本, 表仍旧可以用于读和写操作当索引是被创建或者删除。

    CREATE INDEX 或者DROP INDEX 语句只有完成在所有的事务 访问表完成,

    以致索引的初始状态影响了大多数表的内存。此前,当一个索引是被创建或者删除修改表会导致死锁

    Column Properties

    1.设置列的默认值:: ALTER TABLE tbl ALTER COLUMN col SET DEFAULT literal or ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT

    列的默认值是存储在.frm file 用于表,不是InnoDB 数据目录

    改变自增列的值, ALTER TABLE table AUTO_INCREMENT=next_value;

    尤其是在分布式使用使用复制或者分片,你有时候重置 auto-increment 统计指定一个表到一个指定的值。

    下一行插入到表使用指定的值用它的自增列。

    你可能也需要使用这种技术在数据库仓库环境 你周期性的清空所有的表和加载它们,你可以重启 auto-increment sequence from 1.
    2.重命名一列:

    ALTER TABLE tbl CHANGE old_col_name new_col_name datatype

    当你保持相同的数据类型,和[NOT] NULL attribute,只改变列名, 这个操作可以在线操作。

    你也可以重命名属于外键约束的列.

    任何ALTER TABLE 操作带 ALGORITHM=COPY 子句提供并发访问DML操作。 并发查询是仍旧被允许。

    也就是说, 一个表复制操作总是包括至少LOCK=SHARED的并发限制(允许查询不允许DML).

    你可以进一步限制并发对于指定 LOCK=EXCLUSIVE的操作(防止DML和查询)

    并发DML 但是表复制仍旧需要:

    一些其他的ALTER TABLE 操作允许并发的DML 但是仍旧需要一个表复制。然而,

    表复制对于那些草最是更快的相比在MySQL 5.5和之前版本

    1.增加,删除,或者重新排序列

    2.增加或者删除一个主键

    3.改变ROW_FORMAT 或者KEY_BLOCK_SIZE 对于一个表的属性

    1. 改变一个列的的nullable 状态

    5.OPTIMIZE TABLE

    1. 重建表使用FORCE 选项

    2. 重建表使用一个”null” ALTER TABLE … ENGINE=INNODB statement

    维护CREATE TABLE 语句:

    随着数据库schema 涉及新的列,数据类型,约束,indexes,等等,

    保持你的CREATE TABLE语句更新最新的表定义。 即使在线DDL 的性能改进,

    更有效的创建稳定的数据库结构,相比创建一部分的schema 然后执行后来ALTER TABLE语句

    主要的例外是表的secondary indexes 有大量的记录。 它通常是最有效的创建表带所有的细节除了 secondary indexes,

    加载数据,然后创建 secondary indexes. 你可以使用相同的技术对于外键

    (首先加载数据,然后设置外键)

    如果你知道初始数据是干净的,不需要一致性检查在加载阶段

  • 相关阅读:
    等比数列求和公式
    整数除法向上取整
    P3601 签到题
    AcWing 787. 归并排序
    约数个数与约数和专题
    幻灯片
    Div+css学习笔记
    css的树形菜单
    javascript省市联动封装
    url传递中文的解决方案
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351150.html
Copyright © 2011-2022 走看看