14.6.1 Creating InnoDB Tables 创建InnoDB 表:

来源:互联网 发布:网络招聘哪个好 编辑:程序博客网 时间:2024/05/29 10:05
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: 16384Max_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: Compactmysql> 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: 5783552Max_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_tablemysql> 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: CompactZIP_PAGE_SIZE: 01 row in set (0.01 sec)定义主键:总是设置一个主键对于每个InnoDB表, 指定一列或者多列:1. 涉及最重要的查询2.永远不会空的3.不会有重复值4. 很少改变插入的值例如, 一个表包含信息关于people, 你不会创建一个主键在(firstname,lastname)因为不止一个人有相同的名字, 有些人 最后名字是空的,有些人会改变它们的名字。有这么多的束缚,通常没有一个列来作为主键,因此你需要创建一个数字ID列来作为主键或者主键的一部分。你可以定义一个自动增长列,递增的值会自动天出作为记录插入尽管表工作正常在没有定义主键, 主键是设计许多方面的性能,对于大表和经常访问的表是重要的。推荐你总是指定一个primary key 在CREATE TABLE语句。如果你创建表,load data,运行 ALTER TABLE 来增加主键

0 0
原创粉丝点击