14.8.1 Creating InnoDB Tables 创建InnoDB 表
创建一个InnoDB表,使用CREATE TABLE 语句,你不需要指定ENGINE=InnoDB 子句
如果InnoDB 是定义为默认的存储引擎,在MySQL 5.5是默认为InnoDB.
你仍旧可以使用 ENGINE=InnoDB clause 如果你计划使用mysqldump或者复制 来重现CREATE TABLE 在一个server上
那个server 默认不是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 启用时,一个InnoDB 表时隐式的创建在一个单独的 file-per-table tablespace.
相反,当innodb_file_per_table is disabled, 一个InnoDB 表时隐式的创建在系统表空间。
当你创建一个InnoDB 表,MySQL 创建一个 .frm file 在一个数据库目录在MySQL data directory.目录下。
一个.ibd文件也会被创建 一个表创建在 system tablespace 是创建在存在的system tablespace ibdata files.
在内部, InnoDB 增加一个条目对于每个表到InnoDB 的数据字典。
条目包含数据库名字 比如,如果表t1是创建在test数据库下,
数据目录条目是'test/t1'.
这意味着你能创建相同的名字的表在不同的数据库,表名字在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的hang格式属性是 Compact
尽管设置是好的对于基本的实验,使用动态或者压缩行格式来利用InnoDB的功能
比如表压缩和off-page storage 用于long列的值 使用那些行格式需要innodb_file_per_table 启用
mysql> SHOW TABLE STATUS FROM zjzc like 'Client'\G;
*************************** 1. row ***************************
Name: Client
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 13244
Avg_row_length: 436
Data_length: 5783552
Max_data_length: 0
Index_length: 3620864
Data_free: 3145728
Auto_increment: 13778
Create_time: 2016-10-28 09:46:59
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
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=barracuda;
CREATE TABLE t3 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=DYNAMIC;
CREATE TABLE t4 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=COMPRESSED;
Defining a Primary Key for InnoDB Tables 定义一个主键在InnoDB 表上
1.总是设置一个主键对于每个InnoDB表,指定列或者多列
2. 被用于最重要的查询
3.永远不会是空的
4.不会有重复值
5.很少改动一旦插入后
例如, 在一个表包含信息关于people, 你不能创建一个主键在(firstname, lastname)
因为不止一个人有相同的名字, 有些人last name是空白的,有些人会改变它们的名字。
有这么多的约束, 没有一个明显的列来使用作为主键。
因此你可以创建一个数据列ID 来作为主键,你可以定义一个自增列