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 来增加主键























posted @ 2016-07-01 13:21  czcb  阅读(134)  评论(0编辑  收藏  举报