mysql 开发基础系列10 存储引擎 InnoDB 介绍
一. 概述:
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 介绍的更多相关文章
- mysql 开发基础系列9 存储引擎 MyISAM 介绍
MyISAM是mysql 默认存储引擎,它不支持事务,外键.但访问速度快,对事务完整性没有要求或者以select,insert 为主的应用基本上都可以使用这个引擎.每个MyISAM在磁盘上存储成3个文 ...
- mysql 开发基础系列11 存储引擎memory和merge介绍
一. memory存储引擎 memoery存储引擎是在内存中来创建表,每个memory表只实际对应一个磁盘文件格式是.frm. 该引擎的表访问非常得快,因为数据是放在内存中,且默认是hash索引, ...
- mysql 开发基础系列12 选择合适的数据类型(上)
一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...
- mysql 的逻辑架构 与 存储引擎的介绍
mysql 的逻辑架构分为三层: 最上层的服务大多数基于网络的客户端.服务器的工具或者服务都有类似的架构,比如连接处理,授权认证.安全等 第二层架构:mysql的核心服务功能都在这一层,包括查询解析, ...
- mysql 开发基础系列8 表的存储引擎
一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...
- mysql 开发基础系列15 索引的设计和使用
一.概述 所有mysql 列类型都可以被索引,是提高select查询性能的最佳方法. 根据存储引擎可以定义每个表的最大索引数和最大索引长度,每种引擎对每个表至少支持16个索引,总索引长度至少为256字 ...
- mysql 开发基础系列20 事务控制和锁定语句(上)
一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...
- mysql 开发基础系列21 事务控制和锁定语句(下)
1. 隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...
- MySQL中四种常用存储引擎的介绍
MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...
随机推荐
- ----regular expression in js----
正则表达式:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 搜索模式可用于文本搜索和文本替换. ...
- SHELL脚本学习-练习写一个脚本3
#通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...
- Jmeter多用户利用集合点瞬压并发测试
在测试一些限时秒杀类似的接口时,需要模拟多用户同时一瞬间访问接口,我们这里简单模拟多用户同时访问百度. 1.首先打开Jmeter,在测试计划下添加线程组. 2.在线程组下添加HTTP请求. 3.在HT ...
- excel日期拾取插件(支持Excel 2007 - 2016)
插件安装完毕后示意图如下: 插件安装说明请查看附件里面的安装说明. 插件下载
- JMeter接口压测——ServerAgent监控服务端性能指标
ServerAgent作为一个服务端性能监控插件,结合JMeter自身插件PerfMon可以实现JMeter压测的图形化实时监控,具有良好的实用性.下面讲解一个应用实例 思路: 1. 插件准备 2.打 ...
- s6-3 通信模型
传输层的作用范围 通信5元组 一些已分配的知名端口 三元组 协议. 本地端点. 远方端点 五元组 协议. 本地IP地址.本地端口号. 远端IP地址.远端端口号 通信5元组 源IP 源端口 目的I ...
- Adnroid开发环境搭建(四步搞定)
新手博友,多多关照 下面给大家介绍JDK Eclipse AndroidSDK ADT环境搭建,安装教程 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSDK: ...
- VC6 LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
在使用VC++运行程序时,第一次没有任何问题,但是当再次运行时就会出现:LINK : fatal error LNK1168: cannot open Debug/Test.exe for writi ...
- 20145232韩文浩《网络对抗》MSF基础应用
MS08-067漏洞攻击 攻击机:Kali:192.168.31.132 靶机:win XP SP3(English):192.168.31.180 在VMware中设置两台虚拟机网络为NAT模式,自 ...
- python2 python3区别(续)
1.除法 Python2 Python3 int/int → int int/int → float python2下整数除以整数返回整数类型,python3下整数除以整数返回浮点数类型 当某些语句假 ...