存储引擎:InnoDB

  • InnoDB 存储引擎

    优点:

    1. 提供 提交,回滚,崩溃恢复能力的事务安全。
    2. 支持外键约束
    3. 锁机制默认为行锁
    4. 支持B Tree索引和集群索引;
    5. 支持数据缓存和索引缓存。

    缺点:

    1. 空间使用较高来保留数据和索引;
    2. 内存使用占用较高;
    3. 批量插入速度相比myisam较慢;
    4. 访问速度相比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查看。
    页面太乱,清屏下mysql system 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把内部数据词典和在线重做日志放在这个文件中。

猜你喜欢

转载自blog.csdn.net/qq_17033579/article/details/82020248