存储引擎

目录

一、数据库引擎定义

种类

端口号

二、引擎详解

1、InnoDB 存储引擎

InnoDB主要特性有:

可能的缺点:

适用场景:

2、MyISAM 存储引擎

MyISAM主要特性:

可能的缺点:

适用场景:

3、MEMORY 存储引擎

MEMORY主要特性:

4、NDB 存储引擎

5、Memory (Heap) 存储引擎

可能的缺点:

适用场景:

6、Archive 存储引擎

7、Federated 存储引擎

8、Maria 存储引擎

三、MyISAM与InnoDB的区别

1、存储结构

2、事务支持

3、锁粒度

4、索引类型

5、AUTO_INCREMENT

6、存储空间

7、备份及恢复策略

8、其他

9、MyISAM与InnoDB的选择

四、存储引擎的选择


一、数据库引擎定义

数据库引擎是数据库用于存储、处理和保护数据的核心服务,不同的数据库引擎有各自的特点,如存储机制,索引技巧,主键的处理,锁的粒度等特点便随着引擎的不同而变化。因此,针对自己的项目特点选择合适的数据库引擎可以改善服务器端存储性能。

种类

常见的四种MySQL数据库引擎有:InnoDB、MyISAM、MEMORY、Archive

端口号

MySQL默认端口号:3306

SqlServer默认端口号:1433

Oracle默认端口号:1521

二、引擎详解

1、InnoDB 存储引擎

InnoDB 是事务型数据库的首选引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种隔离级别,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于高并发情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键),InnoDB 是默认的 MySQL引擎。

主要是面向在线事务处理方面的应用,特点是行锁设计,并支持外键。Innodb采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id,作为主键。

该引擎的设计目标便是处理大容量数据的数据库系统,MySQL在运行时InnoDB会在内存中建立缓冲池,用于缓存数据及索引。

InnoDB主要特性有:

(1)InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合

(2)InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的

(3)InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上

(4)InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

(5)InnoDB被用在众多需要高性能的大型数据库站点上

(6)InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件

可能的缺点:

(1)该引擎不支持FULLTEXT类型的索引
(2)没有保存表的行数,在执行select count(*) from 表名 时,需要遍历扫描全表

适用场景:

(1)经常需要更新的表,适合处理多重并发的更新请求
(2)支持事务
(3)外键约束
(4)可以从灾难中恢复(通过bin-log日志等)
(5)支持自动增加列属性auto_increment

2、MyISAM 存储引擎

MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事物

MyIsam引擎是MySQL主流引擎之一,但它相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些,在高并发时可能会遇到瓶颈,但MyIsam引擎独立于操作系统,可以在windows及linux上使用。

MyISAM主要特性:

(1)大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持

(2)当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成

(3)每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16

(4)最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上

(5)BLOB和TEXT列可以被索引

(6)NULL被允许在索引的列中,这个值占每个键的0~1个字节

(7)所有数字键值以高字节优先被存储以允许一个更高的索引压缩

(8)每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快

(9)可以把数据文件和索引文件放在不同目录

(10)每个字符列可以有不同的字符集

(11)有VARCHAR的表可以固定或动态记录长度

(12)VARCHAR和CHAR列可以多达64KB

使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)

可能的缺点:

不能在表损坏后恢复数据

适用场景:

1. MyIsam极度强调快速读取

2. MyIsam表中自动存储了表的行数,需要时直接获取即可

3. 适用于不需要事物支持、外键功能、及需要对整个表加锁的情形

3、MEMORY 存储引擎

MEMORY 存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

MEMORY主要特性:

(1)MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度

(2)MEMORY存储引擎执行HASH和BTREE缩影

(3)可以在一个MEMORY表中有非唯一键值

(4)MEMORY表使用一个固定的记录长度格式

(5)MEMORY不支持BLOB或TEXT列

(6)MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引

(7)MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)

(8)MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享

(9)当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)

4、NDB 存储引擎

DB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC,但它是 Share Nothing 的架构,因此能提供更高级别的高可用性和可扩展性。NDB 的特点是数据全部放在内存中,因此通过主键查找非常快。关于 NDB,有一个问题需要注意,它的连接(join)操作是在 MySQL 数据库层完成,不是在存储引擎层完成,这意味着,复杂的 join 操作需要巨大的网络开销,查询速度会很慢。

5、Memory (Heap) 存储引擎

Memory 存储引擎(之前称为 Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。 HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。

    Memory同时支持散列索引和B树索引,B树索引可以使用部分查询和通配查询,也可以使用<,>和>=等操作符方便数据挖掘,散列索引相等的比较快但是对于范围的比较慢很多

可能的缺点:

1. 要求存储的数据是数据长度不变的格式,Blob和Text类型数据不可用(长度不固定)

2. 用完表格后表格便被删除

适用场景:

1. 那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地堆中间结果进行分析并得到最终的统计结果

2. 目标数据比较小,而且非常频繁的进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小

3. 数据是临时的,而且必须立即能取出用到,于是可存放在内存中

4. 存储在Memory表中的数据如果突然间丢失的话也没有太大的关系

6、Archive 存储引擎

正如其名称所示,Archive 非常适合存储归档数据,如日志信息。它只支持 INSERT 和 SELECT 操作,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10。其设计的主要目的是提供高速的插入和压缩功能。

7、Federated 存储引擎

Federated 存储引擎不存放数据,它至少指向一台远程 MySQL 数据库服务器上的表,非常类似于 Oracle 的透明网关。

8、Maria 存储引擎

Maria 存储引擎是新开发的引擎,其设计目标是用来取代原有的 MyISAM 存储引擎,从而成为 MySQL 默认的存储引擎。

上述引擎中,InnoDB 是事务安全的存储引擎,设计上借鉴了很多 Oracle 的架构思想,一般而言,在 OLTP应用中,InnoDB 应该作为核心应用表的首先存储引擎。InnoDB 是由第三方的 Innobase Oy 公司开发,现已被

Oracle 收购,创始人是 Heikki Tuuri,芬兰赫尔辛基人,和著名的 Linux 创始人 Linus 是校友。

三、MyISAM与InnoDB的区别

1、存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。

table_name.frm      存储表结构(定义)。
table_name.MYD      存储数据
table_name.MYI      存储索引文件

InnoDB:把数据存储在表空间中,分为两种方式: 
(1)所有InonoDB表的数据和索引放置于同一个表空间中; 
(2)每个表单独使用一个表空间存储表的数据和索引。 
当所有表位于同一表空间中,其数据文件存于数据目录下以ibddata[#]来命名。这种方式不利于管理和备份恢复。所以一般使用第二种方式,每张表创建单独的表空间,用来实现InnoDB所支持的高级特性,比如单表导入导出,单标备份等功能。数据文件为:

table_name.ibd 存储数据和索引 
table_name.frm 存储表结构(定义)

2、事务支持

MyISAM:强调性能,其执行速度比InnoDB类型更快但不提供事务的支持,也不支持外键,适用于大量select操作的应用场景。

InnoDB:支持事务,并把事务分为四个隔离级别,

READ-UNCOMMITTED:   读未提交容易发生脏读;
READ-COMMITTED:     读提交,该级别不可重复读;
REPEATABLE-READ:    可重复读,该级别容易发生幻读;
SERIALIZABLE:       串行化;

默认级别为REPEATABLE-READ。适合对事务要求较高的场景中,较适用于处理大量短期事务。 
同时,InnoDB也支持外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

3、锁粒度

MyISAM:只支持表锁。,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 
InnoDB:支持行锁,极大提升并发能力,并使用间隙锁来防止幻读。当然InnoDB的行级锁也并非绝对,当SQL语句在执行过程中在不能确定扫描范围时也会对整张表进行锁定(只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的)。

4、索引类型

MyISAM:非聚集索引并且支持全文索引(fulltext index)。允许没有任何索引和主键的表存在,索引都是保存行的地址。 
InnoDB:聚集索引,辅助索引,可以使用sphinx插件支持全文索引。如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值的数据列。

5、AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。 
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认)、动态表、压缩表。 
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

7、备份及恢复策略

MyISAM:只支持温备与冷备。崩溃后无法安全恢复。 
InnoDB:支持热备、温备、冷备。崩溃后可安全恢复。

8、其他

(1)MyISAM保存有表的总行数,如果select count() from table;会直接取出出该值。InnoDB没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。 
(2)MyISAM不支持外键;而InnoDB支持外键。 
(3)MyISAM不支持hash索引;InnoDB支持自适应的hash索引,使用MVCC来支持高并发。

9、MyISAM与InnoDB的选择

数据库引擎的选择需要我们根据实际情况来选择。默认的InnoDB已经足够使用。 
(1)当项目中需要事务处理或是外键,那么应该使用InnoDB 。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,但是,我们其实并不会经常地去海量记录。所以,就算是慢一点,我们可以通过使用Sphinx从InnoDB中获得全文索引。 
(2)数据的大小,同样是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB只需要几分钟。 
(3)当并发量不大的时候,大批的insert语句或select语句在MyISAM下会快一些,因为MyISAM提供高速存储和检索,以及全文搜索能力。但是当并发量大的时候,在用InnoDB就比MyISAM效率高多了。因为MyISAM只支持表锁,而InnoDB支持效率更高的行锁。

四、存储引擎的选择

不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:

特点

MyISAM

InnoDB

NDB

Memory

Archive

批量插入的速度

非常高

事务安全

 

支持

支持

 

 

全文索引

支持

 

 

 

 

锁机制

表锁

行锁

页锁

表锁

行锁

存储限制

没有

64TB

没有

没有

B树索引

支持

支持

支持

支持

 

哈希索引

 

支持

 

支持

 

集群索引

 

支持

 

 

 

数据缓存

 

支持

 

支持

 

索引缓存

支持

支持

 

支持

 

数据可压缩

支持

 

 

 

支持

空间使用

N/A

非常低

内存使用

中等

支持外键

 

支持

 

 

 

(1)如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

(2)如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

(3)如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

(4)如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值