一. 概述:

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. thymelead入门 git地址在文档最后

    流程:##### 流程###### 1:pom添加依赖 <dependency> <groupId>org.springframework.boot</groupId&g ...

  2. 【Python】 Python3 环境搭建

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. Windo ...

  3. Python从入门到精通之Third!

    Python运算符 算数运算符:+    -    *   /     %    //    **  比较运算符:==    >     <     >=   大于等于      & ...

  4. .gitignore语法

    没嘛用 “#”表示注释 “!”表示取消忽略 空行不作匹配 若匹配语句中无“/ ” ,便将其视为一个 glob匹配,如'abc'可以匹配 ' abc' , 'cd/abc' , 'ef/abcde.tx ...

  5. 数据结构与STL容器

    1.静态数组 静态数组就是大小固定不能扩展的数组,如C中普通数组.C++11中array. 2.动态数组 动态数组的空间大小在需要的时候可以进行再分配,其代表为vector.由于数组的特点,在位置0插 ...

  6. oracle创建与mysql的dblink

    1.先简单介绍下环境   操作系统:windows 2008 R2 (64bits) oracle数据库:10gr2 10.2.0.3.0(32bits) mysql数据库:5.1 (32bits) ...

  7. 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP

    不管是app的下载链接还是普通文件的链接在微信内置浏览器或者QQ内置浏览器都会被屏蔽.这是微信对第三方下载域名实施的拦截政策.被拦截了用户在微信内打开就会提示“已停止访问该网页”. 那么当我们遇到这个 ...

  8. BZOJ3105-新Nim游戏

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  9. 生成二维码图片(tp3.2)

    下载二维码库 放在适合的地方 生成二维码 这里存在表里 效果(查看时)

  10. junit 方法:assertEquals 和 assertTrue

    assertEquals 和 assertTrue 区别相同之处:都能判断两个值是否相等 assertTrue 如果为true,则运行success,反之Failure assertEquals 如果 ...