十六.MySQL存储引擎

1.存储引擎概述

和大多数的数据库不同,MySQL中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎。
存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。
Oracle, SQL Server等数据库只有一种存储引擎,MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。
MySQL5.0支持的存储引擎包含: InnoDB, MyISAM, BDB, MEMORY, MERGE, EXAMPLE, NDB Cluster, ARCHIVE, CSV, BLACKHOLE,FEDERATED等, 其中InnoDB和BDB提供事务安全表,其他引擎是非事务安全表。
可以通过指令

show engines;

来查询当前数据库支持的存储引擎:
在这里插入图片描述
创建新表时如果不指定存储引擎,那么系统就会使用默认的存储引擎,MySQL5.5之前的默认存储引擎是MyISAM, 5.5之后改为了InnoDB.
查看MySQL数据库默认的存储引擎,指令:

show variables like '%storage_engine%';

2.各种存储引擎特性

在这里插入图片描述

(1).InnoDB

InnoDB存储引擎是MySQL的默认存储引擎。InnoDB存储引擎提供了具有提交,回滚,崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
InnoDB存储引擎不同于其他存储引擎的特点

事务控制

-- 创建表
create table goods_innodb(
     id int not null auto_increment,
     name varchar(20) not null,
     primary key(id)
)engine=innodb default charset=utf8;

-- 事务操作
start transaction;
insert into goods_innodb(id, name)values(null, 'Meta20');
commit;

打开另一个窗口,当事务未提交时可以看到在另一个窗口查询不到刚插入的数据,只有当事务提交后,才能在另一个窗口捡到

外键约束

MySQL支持外键的存储引擎只有InnoDB, 在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候,也会自动的创建对应的索引。
示例:
下面两张表中,country_innodb是父表,country_id为主键索引,city_innodb表是子表,country_id字段为外键,对应于country_innodb表的主键country_id。

create table country_innodb(
    country_id int not null auto_increment,
    country_name varchar(100) not null,
    primary key(country_id)
)engine=InnoDB default charset=utf8;

create table city_innodb(
   city_id int not null auto_increment,
   city_name varchar(50) not null,
   country_id int not null,
   primary key(city_id),
   key idx_fk_country_id(country_id),
   constraint fk_city_country foreign key(country_id) references country_innodb(country_id) on delete restrict on update cascade
)engine=InnoDB default charset=utf8;
ON DELETE RESTRICT ----> 删除主表数据时,如果有关联记录,不删除;
on update cascade ----> 更新主表时,如果子表有关联记录,更新字段表记录;

存储方式

InnoDB存储表和索引一下两种方式:
[a].使用共享表空间存储,这种方式创建的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
[b].使用多表空间存储,这种方式存储的表的表结构仍然在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。
在这里插入图片描述

(2).MyISAM

MyUSAM不支持事务,也不支持外键,其优点是访问的速度快,对事务的完整性没有要求或者以select,insert为主的应用基本上都可以使用这个引擎来创建表。

不支持事务

create table goods_myisam(
    id int not null auto_increment
    name varchar(20) not null,
    primary key(id)
)engine=myisam default charset=utf8;

在这里插入图片描述
通过测试,我们发现,在MyISAM存储引擎中,是没有事务控制的

文件存储方式

每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但扩展名分别是:
.frm(存储表定义)
.MYD(MyData, 存储数据)
.MYI(MYIndex, 存储索引)
在这里插入图片描述

(3).MEMORY

Memory存储引擎将表的数据存放在内存中。每个MEMORY表实际对应一个磁盘文件,格式是.frm, 该文件中只存储表的结构,而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。MEMORY类型的表访问非常地块,因为它的数据存放在内存中的,并且默认使用HASH索引,但是服务一旦关闭,表中的数据就会丢失。

(4).MERGE

MERGE存储引擎一组MyISAM表的组合,这些MyISAM表必须结构完全相同,对MERGE的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
对于MERGE类型表的插入操作,是通过insert_method子句定义插入表,可以有3个不同的值,使用FIRST或LAST值使得插入操作被相应地作用在第一或者最后一个表上,不定义这个子句或者定义为NO, 表示不能对这个merge表执行插入操作。
可以对memory表进行drop操作,但是这个操作只是删除merge表的定义,对内部的表是没有任何影响的。
在这里插入图片描述

3.存储引擎的选择

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB: 是MySQL的默认存储引擎,用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询意外,还包含很多的更新、删除操作那么InnoDB存储引擎是比较合适的选择。InnoDB存储引擎除了有效的降低由于删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似于计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB是最合适的选择。
  • MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
  • MEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据环境下。可以提供几块的访问。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。
  • MERGE:用于将一系列等同的MvSAM表以逻辑方式组合在一起,并作为一个对象引用他们。MERGE表的优点在于可以突破对单个MylSAM表的大小限制,并且通过将不同的表分布在多个磁盘上,可以有效的改善MERGE表的访问效率。这对于存储诸如数据仓储等VLDB环境十分合适。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值