• 14.6.1 Creating InnoDB Tables 创建InnoDB 表:


    14.6.1 Creating InnoDB Tables  创建InnoDB 表:
    
    
    创建一个InnoDB 表,使用CREATE TABLE 语句,你不需要指定 ENGINE=InnoDB子句 
    
    如果InnoDB 定义为默认的存储引擎,  在MySQL 5.5是默认的版本。
    
    
    你仍旧可以使用ENGINE=InnoDB 子句如果你计划使用mysqldump或者复制来replay 
    
    CREATE TABLE 语句在一个服务器上,默认的存储引擎不是InnoDB.
    
    -- Default storage engine = InnoDB.
    CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a));
    -- Backward-compatible with older MySQL.
    CREATE TABLE t2 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
    
    
    一个InnoDB 表和它的索引可以被创建在系统表空间或者在一个单独的file-per-table tablespace. 
    
    
    当 innodb_file_per_table 被启用, 在MySQL 5.6.6是默认设置,
    
    
    一个InnoDB 表是隐含创建在一个单独的file-per-table tablespace.
    
    相反, 当 innodb_file_per_table 被禁用,一个InnoDB 表是隐式的创建在system tablespace.
    
    
    
    当你创建一个InnoDB 表, MySQL 创建一个.frm 文件在数据库目录在MySQL 数据目录下。
    
    
    一个表创建在file-per-table tablespace, 一个.ibd文件也会被创建。
    
    [root@wx03 DEVOPS]# ls -ltr machine_info.*
    -rw-rw---- 1 mysql mysql   8640 May  6 15:21 machine_info.frm
    -rw-rw---- 1 mysql mysql 114688 May  6 15:21 machine_info.ibd
    
    
    一个表创建在system tablespace 是创建在存在的系统表空间ibdata 文件里。
    
    
    ibd是MySQL数据文件、索引文件,无法直接读取。
    frm是表结构文件,可以直接打开。
    
    
    在内部,InnoDB 增加一个条目对于每个表在InnoDB 数据目录。
    
    
    条目包含数据库名字。比如, 如果table t1创建在test 数据库, 数据目录条目是'test/t1'.
    
    
    这意味着你能创建一个相同名字的表在不同的数据库, 表名字在InnoDB里不冲突
    
    
    查看InnoDB 表的属性:
    
    
    mysql> SHOW TABLE STATUS FROM test LIKE 't%' G;
    *************************** 1. row ***************************
               Name: t1
             Engine: InnoDB
            Version: 10
         Row_format: Compact
               Rows: 0
     Avg_row_length: 0
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2015-03-16 16:26:52
        Update_time: NULL
         Check_time: NULL
          Collation: latin1_swedish_ci
           Checksum: NULL
     Create_options: 
            Comment: 
    1 row in set (0.00 sec)
    
    
    
    在状态输出下,你可以看到表t1的Row 格式属性
    
    Row_format: Compact
    
    
    mysql> SHOW TABLE STATUS FROM zjzc LIKE 'Client' G;
    *************************** 1. row ***************************
               Name: Client
             Engine: InnoDB
            Version: 10
         Row_format: Compact
               Rows: 13013
     Avg_row_length: 444
        Data_length: 5783552
    Max_data_length: 0
       Index_length: 3588096
          Data_free: 4194304
     Auto_increment: 13538
        Create_time: 2016-06-16 18:28:54
        Update_time: NULL
         Check_time: NULL
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options: 
            Comment: 用户表
    
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    
    
    尽管设置是好的对于基本的实验,考虑使用动态的或者压缩的行格式来利用InnoDB 功能
    
    比如表压缩和关闭页面存储对于长的列。
    
    
    使用那些行格式需要启用innodb_file_per_table
    
    
    mysql> show variables like '%innodb_file_format%';
    +--------------------------+----------+
    | Variable_name            | Value    |
    +--------------------------+----------+
    | innodb_file_format       | Antelope |
    | innodb_file_format_check | ON       |
    | innodb_file_format_max   | Antelope |
    +--------------------------+----------+
    3 rows in set (0.00 sec)
    
    
    InnoDB 表的属性可以被查询使用InnODB 信息Schema system tables:
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='zjzc/Client' G
    *************************** 1. row ***************************
         TABLE_ID: 4533
             NAME: zjzc/Client
             FLAG: 1
           N_COLS: 25
            SPACE: 4519
      FILE_FORMAT: Antelope
       ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
    1 row in set (0.01 sec)
    
    
    
    定义主键:
    
    总是设置一个主键对于每个InnoDB表, 指定一列或者多列:
    
    1. 涉及最重要的查询
    
    2.永远不会空的
    
    3.不会有重复值
    
    4. 很少改变插入的值
    
    
    例如, 一个表包含信息关于people, 你不会创建一个主键在(firstname,lastname)
    
    因为不止一个人有相同的名字, 有些人 最后名字是空的,
    
    有些人会改变它们的名字。
    
    
    有这么多的束缚,通常没有一个列来作为主键,
    
    因此你需要创建一个数字ID列来作为主键或者主键的一部分。
    
    
    你可以定义一个自动增长列,递增的值会自动天出作为记录插入
    
    
    尽管表工作正常在没有定义主键, 主键是设计许多方面的性能,对于大表和经常访问的表是重要的。
    
    
    推荐你总是指定一个primary key 在CREATE TABLE语句。
    
    如果你创建表,load data,运行 ALTER TABLE 来增加主键
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

  • 相关阅读:
    Minutes和TotalMinutes的区别
    C#的"?"修饰符和"??"运算符
    Navicat 连接MySQL 8.0.11 出现2059错误
    EL1004E: Method call: Method fmtdate(java.util.Date,java.lang.String) cannot be found on org.thymele
    es nested结构判断不为空
    es nested嵌套查询
    CPU基础知识线程切换
    CPU基础知识CPU的组成 运算器、控制器、寄存器
    几个常用寄存器
    Linux笔记用户态与内核态
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350614.html
Copyright © 2020-2023  润新知