一. 概述:

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

1. 自动增长列特点 (AUTO_INCREMENT)

  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,''),(0,''),(NULL,3)

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

2. 自动增长与索引

  对于InnoDB表,自动增长列必须是索引,如果是组合索引,也必须是组合索引的第一列。但对于MYISAM 表,自增长列可以是组合索引的其他列。
  这里简单来说下mysql的索引, 索引的关键词包括: key(普通索引), primary key(主键索引),unique key(唯一索引),index(没有约束的索引)。

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

 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,''),(3,''),(4,''),(2,''),(3,'')

  上面可以看出自增长是按照组合索引的前面几列进行排序后递增的。

3. 外键约束 

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

   -- 创建父表
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;

mysql 开发基础系列10 存储引擎 InnoDB 介绍的更多相关文章

  1. mysql 开发基础系列9 存储引擎 MyISAM 介绍

    MyISAM是mysql 默认存储引擎,它不支持事务,外键.但访问速度快,对事务完整性没有要求或者以select,insert 为主的应用基本上都可以使用这个引擎.每个MyISAM在磁盘上存储成3个文 ...

  2. mysql 开发基础系列11 存储引擎memory和merge介绍

    一. memory存储引擎 memoery存储引擎是在内存中来创建表,每个memory表只实际对应一个磁盘文件格式是.frm.   该引擎的表访问非常得快,因为数据是放在内存中,且默认是hash索引, ...

  3. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  4. mysql 的逻辑架构 与 存储引擎的介绍

    mysql 的逻辑架构分为三层: 最上层的服务大多数基于网络的客户端.服务器的工具或者服务都有类似的架构,比如连接处理,授权认证.安全等 第二层架构:mysql的核心服务功能都在这一层,包括查询解析, ...

  5. mysql 开发基础系列8 表的存储引擎

    一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...

  6. mysql 开发基础系列15 索引的设计和使用

    一.概述 所有mysql 列类型都可以被索引,是提高select查询性能的最佳方法. 根据存储引擎可以定义每个表的最大索引数和最大索引长度,每种引擎对每个表至少支持16个索引,总索引长度至少为256字 ...

  7. mysql 开发基础系列20 事务控制和锁定语句(上)

    一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...

  8. mysql 开发基础系列21 事务控制和锁定语句(下)

    1.  隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...

  9. MySQL中四种常用存储引擎的介绍

    MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...

随机推荐

  1. AspNetCore中的IdentityServer4客户端认证模式实现

    1 AuthorizationServer using IdentityServer4; using IdentityServer4.Models; public class Startup { pu ...

  2. ES部署报错 max file size 和 kibana 报错File size limit exceeded

    启动失败一 ERROR: [2] bootstrap checks failed [1]: max file descriptors [4096] for elasticsearch process ...

  3. k8s对接ceph存储

    前提条件:已经部署好ceph集群 本次实验由于环境有限,ceph集群是部署在k8s的master节点上的 一.创建ceph存储池 在ceph集群的mon节点上执行以下命令: ceph osd pool ...

  4. 2019浙大校赛--G--Postman(简单思维题)

    一个思维水题 题目大意为,一个邮递员要投递N封信,一次从邮局来回只能投递K封.求最短的投递总距离.需注意,最后一次投递后无需返回邮局. 本题思路要点: 1.最后一次投递无需返回邮局,故最后一次投递所行 ...

  5. Go的Get命令兼容公司Gitlab仓库的HTTP协议

    对于公司的私有Gitlab仓库,没有对https支持,在使用最新版本的go get命令时,需要使用-insecure参数来支持http,但如果导入的包里边依赖了需要https的仓库,就不好使了,折腾了 ...

  6. MapGIS DataStore

    http://www.mapgis.com/index.php/index-show-tid-206.html 异构数据同时加载 DCServer感觉已经集成到 IGServer中了. >> ...

  7. 默认空间和webapps下项目部署

    用eclipse默认的工作区和webapps的细节 用{WORKSPACE}表示你的eclipse的工作空间根目录,然后你打开 {WORKSPACE}\.metadata\.plugins\org.e ...

  8. Jmeter学习过程中遇到的那些坑

    开个新帖,持续记录学习jmeter过程中遇到的坑... (1)出师不利 由于公司的产品都是客户端模式,所以所有的接口测试都从获取access-token开始.妹的...上来就是一个坑... 一开始的配 ...

  9. Python 字符串十六进制流

    字符串转十六进制绕过特征检测SQL注入 Python中内置库与出色第三方库的学习 # 字符串转十六进制 mystr = "hello world" print(":&qu ...

  10. Android中系统键盘的自动弹出、隐藏和显示

    一.需求 在开发Android app过程中经常用到EditText,需要在界面加载完成后自动弹出系统键盘,更希望可以控制键盘的隐藏和显示,本文介绍其实现方法. 二.系统键盘的自动弹出 @Overri ...