- InnoDB 存储引擎
优点:
- 提供 提交,回滚,崩溃恢复能力的事务安全。
- 支持外键约束
- 锁机制默认为行锁
- 支持B Tree索引和集群索引;
- 支持数据缓存和索引缓存。
缺点:
- 空间使用较高来保留数据和索引;
- 内存使用占用较高;
- 批量插入速度相比myisam较慢;
- 访问速度相比myisam慢;
- 以下着重阐述存储引擎InnoDB的表在使用过程中不同于其他存储引擎的表的特点。
1 列自增
执行:
create table wq_autoincre_demo(
i smallint not null auto_increment,
name varchar(10),primary key(i)
)engine=innodb;
插入一条记录:(innodb表的自动增长列可以手动插入,主键存在值的前提下,插入0或者null都会自动顺延主键值,即默认自增,按照插入先后顺序),执行语句,图示为结果:
insert into wq_autoincre_demo values(1,'2'),(0,'3'),(null,'4');
select * from wq_autoincre_demo;
第二次插入,则不用给主键值,因为数据库中的主键已经有值了,再次插入0或者null ,则会自动默认顺延主键值,即主键自增。
insert into wq_autoincre_demo values(0,'3'),(null,'4');
select * from wq_autoincre_demo;
可以使用 select last_insert_id()
查询当前线程最后插入记录使用的值。如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长值。
对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。
以下如若是组合索引,必须是组合做引的第一列,对于组合索引第一列,插入值为0或者null顺延同样生效,第一列索引会自增。
create table wq_zuindexinno(
d1 smallint not null auto_increment,
d2 smallint not null,
name varchar(10),
index(d2,d1),
primary key(d1,d2)
)engine=innodb;
insert wq_zuindexinno(d2,name) values(2,'2'),(3,'3'),(4,'4'),(2,'2'),(3,'3'),(4,'4');
select * from wq_zuindexinno;
但是对于myisam的表,自动增长列可以使组合索引的其他列,这样插入记录后,自动增长列是按照组合索引的前面几列进行排序后递增的。eg:新建表 wq_autoincre_demo,自动增长列d1作为组合索引的第二列,插入记录后,发现自动增长列是按照组合索引的第一列d2进行排序后递增的。
create table wq_zuindex(
d1 smallint not null auto_increment,
d2 smallint not null,
name varchar(10),
index(d2,d1)
)engine=myisam;
insert wq_zuindex (d2,name) values(2,'2'),(3,'3'),(4,'4'),(2,'2'),(3,'3'),(4,'4');
select * from wq_zuindex;
2 外键约束
-
mysql支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
-
在创建索引时,父表执行delete/update操作时,可以指定子表进行相应操作,包括 restrict,no action, set null,cascade,set default。 详细可参看:mysql外键设置方式
-
当某个表被其他表创建的外键参照,那么该表对应索引或主键禁止被删除。
-
但也存在关闭外键约束会更好的使用场景:
① 比如:导入多个表的顺序时,如果忽略表之前的导入顺序,可暂时关闭外键的检查;同,在执行load data 和alter table 操作的时候,可暂时关闭外键约束来加快处理速度。执行之前,先执行语句set foreign_key_check=0 ;
然后执行你的操作,操作完毕即可恢复原来外键约束状态set foreign_keu_check=1;
。 -
对innodb类型的表,外键信息可通过
show create table +表名;
或者 ‘show table status ;’ 或者 执行show table status like 'city' \G
查看。
页面太乱,清屏下mysqlsystem clear;
然后执行 ;
show create table city
show table status like 'city' \G
3 存储方式
innodb存储表和索引有以下两种方式。
- 共享表空间存储,这种方式建表结构存储在 .frm文件中,数据和索引存储在 innodb_data_home_dir 和innodb_data_file_path 定义的表空间中,可以是多个文件。
- 多表空间存储,这种方式建表结构存储在.frm文件中,但每个表的数据和索引单独存储在.ibd中。如果是个分区表,则每个分区对应单独的.ibd文件,文件名是“表名+分区名”,可以在分区的时候指定每个分区的数据文件的位置,以此将表的io均匀分布在多个磁盘上。
- 多表空间的参数生效后,只对新建的表生效。
要使用多表空间的存储方式,需设置参数innodb_file_per_table,并且重启服务方能生效,对新建的表按照多表空间的方式创建,对先前已经创建的表,仍按以前创建时候的存储方式,反之亦然。 - 多表空间的数据文件大小没限制,无需设置初始大小,也不需要设置文件最大限制,扩展大小等参数。
- 对于使用多表空间特性的表,可以比较方便的进行单表备份和恢复操作。但是并不能直接复制.ibd文件,因为没有共享表空间的数据字典信息,直接复制.ibd文件和.frm文件恢复时不能被正确识别,但可执行:
alter table tbl_name discard tablespace;
alter table tbl_name import tablespace;
将备份恢复到数据库中,但这种单表备份,只能恢复到表原来所在的数据库中,而不能恢复到其他数据库中。如果想将单表恢复到目标数据库,则需要通过mysqldump和mysqlimport来实现。
附注:
即便在多表空间的存储方式下,共享表空间仍然是必须的,innodb把内部数据词典和在线重做日志放在这个文件中。