存储引擎
存储引擎就是数据库如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
MySQL存储引擎
MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。相比于Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。
MySQL常见存储引擎
- MyISAM:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。
MyISAM的表在磁盘上存储成3个文件,其文件名都和表名相同,扩展名分别是:
.frm(存储表定义)
.MYD(MYData,存储数据)
.MYI(MYIndex,存储索引) - InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能,也是目前MySQL默认的存储引擎。
InnoDB中索引和数据存储在同一个文件,所以InnoDB的表在磁盘上有两个文件,其文件名都和表名相同,扩展名分别是:
.frm(存储表的定义)
.ibd(存储数据和索引) - Memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
每个MEMORY表实际只对应一个磁盘文件,格式是
.frm(表结构定义)。
三者区别
表名解释:
- 锁机制:表示数据库在并发请求访问的时候,多个事务在操作时,并发操作的粒度。
- B-树索引和哈希索引:主要是加速SQL的查询速度,其中B-代表B树和B+数。
- 外键:子表的字段依赖父表的主键,设置两张表的依赖关系。
- 事务:多个SQL语句,保证它们共同执行的原子操作,要么成功,要么失败,不能只成功一部分,失败需要回滚事务。
- 索引缓存和数据缓存:和MySQLServer的查询缓存相关,在没有对数据和索引做修改之前,重复查询可以不用进行磁盘!/0(数据库的性能提升,目的是为了减少磁盘I/0操作来提升数据库访问效率),读取上一次内存中查询的缓存就可以了。
总结
-
InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
-
MyISAM: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
-
MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
查看MySQL存储引擎
可以通过engine关键字在创建或修改数据库时指定所使用到引擎。
show engines;
查看表的存储引擎
show create table student\G
指定存储引擎
在创建表的时候通过engine=...或type=...
来指定所要使用的引擎。
create table user(
id int unsigned primary key not null auto_increment,
name varchar(50) unique not null,
age tinyint not null,
sex enum('M','W') not null
)engine=INNODB default charset=utf8;