存储引擎是基于表的,同一个数据库不一样的表可能有不一样的存储引擎,在MySQL5.5版本以后,存储引擎默认是InnoDB,而在以前默认是MyISAM。html
在MySQL中输入 show engines;
能够查看全部支持的引擎。mysql
show variables like '%storage_engine';
能够查看默认的存储引擎。sql
在建立表的时候能够指定存储引擎 engine关键字数据库
create table goods_innodb( id int NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL, primary key(id) )ENGINE=innodb DEFAULT CHARSET=utf8;
在建立以后经过 alter table
能够将一个已经存在的表修改为其余的存储引擎并发
alter table goods_innodb engine = innodb;
最重要也是最普遍的存储引擎,它被设计用来处理大量短时间事务,短时间事务大部分状况是正常提交的,不多会被回滚。InnoDB的性能和自动崩溃恢复的特性,使得它在非事务型存储的需求中也不多流行。除非有很是特别的缘由须要使用其余引擎。性能
可是对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。插件
特色:支持事务、行级锁、外键设计
在MySQL中执行语句会默认提交,由于是没有开启事务的,在使用InnoDB引擎开启事务以后,新增一条数据3d
start TRANSACTION;//开启事务
INSERT INTO city(city_name,country_id) VALUES('岳阳',4);
数据库仍是查询不到,commit
提交以后数据库才能查询到日志
InnoDB引擎提供了四个约束外键的方式
RESTRICT、NO ACTION:是指限制在子表有关联记录的状况下, 父表不能更新;
CASCADE:表示父表在更新或者删除时,更新或者删除子表对应的记录;
SET NULL: 则表示父表在更新或者删除的时候,子表的对应字段被SET NULL 。
在有外键的状况下,导入数据能够先关闭外键检查,再从新打开
SET FOREIGN_KEY_CHECKS = 0;//关闭外键检查 SET FOREIGN_KEY_CHECKS = 1;//打开外键检查
下面两张表,country是主表,city是父表,
CREATE table country//新建国家表 ( countryID int NOT NULL AUTO_INCREMENT,//自动增加 countryName varchar(100) NOT NULL, primary key(countryID)//主键 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE table city//新建城市表 ( cityID int not NULL AUTO_INCREMENT, cityName VARCHAR(50) not NULL, countryID int , key idx_fk_country_id(countryID),//索引 PRIMARY key(cityID), CONSTRAINT `fk_city_country` FOREIGN KEY(countryID) REFERENCES //外键 //设置了子表删除的时候父表不能更新,父表在更新的时候也更新子表的记录 country(countryID) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=INNODB DEFAULT charset=utf8;
INSERT into country(countryName) values('中国'),('新西兰'); INSERT into city(cityName,countryID) VALUES('长沙',1),('北京',1);
删除countryID=1的数据
DELETE FROM country WHERE countryID=1
更新父表的countryID为10
子表数据变动为
MySQL数据库数据默认存储在 /var/lib/mysql/
下,能够进去查看信息
InnoDB存储表和索引有如下两种方式:
能够比较方便地进行单表备份和恢复操做,可是直接复 制.ibd 文件是不行的,由于没有共享表空间的数据字典信息,直接复制的.ibd 文件和.frm 文 件恢复时是不能被正确识别的,但能够经过如下命令:
ALTER TABLE 表名 DISCARD TABLESPACE; ALTER TABLE 表名 IMPORT TABLESPACE;
可是备份恢复默认只能恢复到以前的数据库,,若是要恢复到其余数据库须要经过 mysqldump 和 mysqlimport 来实现。
即使在多表空间的存储方式下,共享表空间仍然是必须的,InnoDB 把内部数据词典和日志放在这个文件中。
不支持事务也不支持外键,对事物的完整性没有要求或者以select、insert为主的应用基本均可以使用这个引擎。
特色:访问速度快
每一个 MyISAM 在磁盘上存储成 3 个文件,其文件名都和表名相同,但扩展名分别是:
数据文件和索引文件能够放置在不一样的目录,平均分布 IO,得到更快的速度。
MEMORY 存储引擎使用存在内存中的内容来建立表。每一个 MEMORY 表只实际对应一个 磁盘文件,格式是.frm。MEMORY 类型的表访问很是得快,由于它的数据是放在内存中的, 而且默认使用 HASH 索引,可是一旦服务关闭,表中的数据就会丢失掉。
在建立表的时候要在 CREATE TABLE
语句中指定子句,能够用 max_heap_table_size
来设置表的大小进行扩容,表的默认大小是16MB。子句的意思有点像子查询,从其余表取数据。
CREATE TABLE tab_memory ENGINE=MEMORY ( SELECT city_id,city,country_id FROM city GROUP BY city_id; )
SET max_heap_table_size = 1024*1024*2;
建立索引的时候,能够指定使用 HASH 索引仍是 BTREE 索引:
create index mem_hash USING HASH on tab_memory (city_id) ;
MEMORY 类型的存储引擎主要用在那些内容变化不频繁的代码表,或者做为统计操做 的中间结果表,便于高效地对中间结果进行分析并获得最终的统计结果。
MARGE是一组MyISAM表的组合,这些表的结构必须彻底相同,MERGE表自己没有数据,可是能够对该表进行查询,更新、删除。DROP删除MARGE表时不会对其余表数据形成影响。
使用MARGE建立表citys_all
create table city1( city1_id int not NULL AUTO_INCREMENT, city_name varchar(50), primary key (city1_id) )engine = myisam default charset=utf8; create table city2( city2_id int not NULL AUTO_INCREMENT, city_name varchar(50), primary key (city2_id) )engine = myisam default charset=utf8; create table citys_all( city_id int , city_name varchar(50), primary key (city_id) )engine = merge union = (city1,city2) INSERT_METHOD=LAST default charset=utf8; INSERT into city1(city_name) values('长沙'),('北京'); INSERT into city2(city_name) values('上海'),('深圳');
INSERT_METHOD
插入表能够有三个不一样的值
FIRST:使得插入操做在第一个表
LAST:使得插入操做在最后一个表
NO:不能对表进行插入操做
查询city1表
查询city2表
查询citys_all表
往citys_all中插入一条数据,由于建立该表时定义的是INSERT_METHOD=LAST,因此会在最后一张表city2中插入。
insert into citys_all values(3,'海口');
下面是经常使用存储引擎的适用环境。