mysql 开发基础系列10 存储引擎 InnoDB 介绍

一. 概述:

  InnoDB存储引擎提供了具备提交,回滚,和崩溃恢复能力的事务安全,对比MYISAM 的存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。它的特色有以下:mysql

1. 自动增加列特色 (AUTO_INCREMENT)sql

  InnoDB表的自动增加列能够手工插入,但插入的值若是是空或者是0,则实际插入的将是自动增加的值,下面演示下数据库

CREATE TABLE autoincre_demo ( i SMALLINT NOT NULL AUTO_INCREMENT, NAME VARCHAR(10), PRIMARY KEY(i) )ENGINE=INNODB INSERT INTO autoincre_demo VALUES(1,'1'),(0,'2'),(NULL,3)

  能够经过alter table autoincre_demo auto_increment=n 来设置自增加的初使值,该值是保留在内存中,如重启数据库这个强制的默认值就会丢失。安全

2. 自动增加与索引服务器

  对于InnoDB表,自动增加列必须是索引,若是是组合索引,也必须是组合索引的第一列。但对于MYISAM 表,自增加列能够是组合索引的其余列。
  这里简单来讲下mysql的索引, 索引的关键词包括: key(普通索引), primary key(主键索引),unique key(惟一索引),index(没有约束的索引)。spa

  下面演示下Myisam类型的表autoincre_demo, 自动增加列d1做为组合索引第二列。3d

CREATE TABLE autoincre_demo ( d1 SMALLINT NOT NULL AUTO_INCREMENT, d2 SMALLINT NOT NULL, NAME VARCHAR(10), INDEX(d2,d1) )ENGINE=MYISAM INSERT INTO autoincre_demo(d2,NAME) VALUES(2,'2'),(3,'3'),(4,'4'),(2,'2'),(3,'3')

  上面能够看出自增加是按照组合索引的前面几列进行排序后递增的。rest

3. 外键约束 code

  mysql 支持外键的存储引擎只有innodb,在建立外键的时候,要求父表必须有对应的索引,子表建立外键的时候也会自动建立对应的索引
下面演示两个表 country 父表country_id列为 主键索引, city子表其中country_id列为外键blog

-- 建立父表
CREATE TABLE country ( country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country VARCHAR(50) NOT NULL, PRIMARY KEY(country_id) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 建立子表 关联country_id
CREATE TABLE city ( city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country_id SMALLINT UNSIGNED NOT NULL , PRIMARY KEY(city_id), KEY idx_fk_country_id (country_id), CONSTRAINT fk_city_country  FOREIGN KEY(country_id)  REFERENCES country(country_id) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=INNODB DEFAULT CHARSET=utf8

下面先说下里面的关键词的含义:
  unsigned:表示无符号的意思,也就是非负数,只用于整型。
  key: 为country_id建个索引,名叫dx_fk_country_id。
  CONSTRAINT:关键词是约束,外键约束名叫fk_city_country,FOREIGN KEY是对应的外键字段。
  references:是引用country表的country_id字段。
在删除更新父表时,对子表相应的操做包括restrict,cascade,set null 和no action。
  其中restrict与no action相同 是指限制在:子表有关联记录的状况下父表不能更新; cascade表示父表在更新或者删除时,同时更新或删除子表相应记录。set null则表示在更新或者删除时,子表对应字段被设置为null。
了解后在看on delete ,restrict 是指:主表删除记录时,若是子表有对应记录,则不容许删除。
  on update cascade 是指:主表更新记录时,若是子表有对应记录,则子表对应更新;

--先维护下数据
INSERT INTO country(country) VALUES('中国'); INSERT INTO city (country_id) VALUES(1);

-- 先试下on delete ,restrict的做用,主表删除记录时,若是子表有对应记录,则不容许删除
DELETE FROM country WHERE country_id=1

-- 再试下on update cascade 是指主表更新记录时,若是子表有对应记录,则子表对应更新;
UPDATE country SET country_id=2 WHERE country_id=1;

  在导入多个表数据时,若是须要忽略以前的导入顺序,能够暂时关闭外键的检查,加快处理速度。

-- 关闭命令是
set foreign_key_checks=0; -- 开启
set foreign_key_checks=1;

  对于INNODB类型表,外键的信息经过使用INFORMATION_SCHEMA查看

SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA ='test'

4. 存储方式(简单了解)

         innodb存储表和索引有两种方式。

         一是使用共享表空间存储,这种方式建立的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,能够是多个文件。

         二是使用多表空间存储,这种方式建立的表的表结构保存在.frm文件中,每一个表的数据和索引单独保存在.ibd中,若是是分区表,则每一个分区对应单独的.ibd文件,文件名是"表名+分区名"

      须要使用多表空间存储,须要设置参数innodb_file_per_table,并从新启动服务后生效。 新建的表就按多表空间来存储,已有表仍然使用共享表空间存储。

   多表空间存储的优点是方便进行单表备份和恢复操做。注意:表结构务必一致,innodb_page_size也要一致,表空间文件迁移命令以下(5.6及以上):

 --目标服务器上删除旧表空间文件,执行完这个命令以后,ibd文件就没有了,只剩frm文件了。
alter table xx discard tablespace;
--源服务器上:将文件cp到目标实例上,修改权限.执行完这个命令以后,表能够读取,但没法修改,metadata lock flush table xx for export
--在目标实例上执行import tablespace。源实例上再unlock tables alter table xx import tablespace;
相关文章
相关标签/搜索