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