MySQL存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

#查看存储引擎
SHOW ENGINES;

#查看数据库默认使用哪个引擎,可以通过使用命令:
SHOW VARIABLES LIKE 'storage_engine';

在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。Support列的值表示某种引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎 。

在谈不同的存储引擎之前,我们需要先理解几个基本概念:

事务

事务是一组原子性的SQL语句或者说是一个独立的工作单元,如果数据库引擎能够成功对数据库应用这组SQL语句,那么就执行,如果其中有任何一条语句因为崩溃或其它原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

举个银行应用的典型例子:

假设银行的数据库有两张表:支票表和储蓄表,现在某个客户A要从其支票账户转移2000元到其储蓄账户,那么至少需求三个步骤:

a.检查A的支票账户余额高于2000元;

b.从A的支票账户余额中减去2000元;

c.在A的储蓄账户余额中增加2000元。

这三个步骤必须要打包在一个事务中,任何一个步骤失败,则必须要回滚所有的步骤,否则A作为银行的客户就可能要莫名损失2000元,就出问题了。这就是一个典型的事务,这个事务是不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不可能只执行其中一部分,这也是事务的原子性特征。

读锁和写锁
无论何时,只要有多个SQL需要同一时刻修改数据,都会产生并发控制的问题。

假设一个公共邮箱,用户A正在读取邮箱,同时,用户B正在删除邮箱中的某个邮件,会产生什么结果呢?客户A可能读取时会报错退出,也可能会读取到不一致的邮箱数据。如果把邮箱当作数据库中的一张表,可见其存在同样的问题。

解决这类经典问题的方法就是并发控制,即在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种锁就是共享锁和排他锁,也叫读锁和写锁。

读锁是共享的,即相互不阻塞的,多个客户在同一时刻可以读取同一资源,互不干扰。写锁是排他的,即一个写锁会阻塞其它的写锁和读锁,只有这样,才能确保给定时间内,只有一个用户能执行写入,防止其它用户读取正在写入的同一资源。写锁优先级高于读锁。
 

行锁和表锁
实际数据库系统中每时每刻都在发生锁定,锁也是有粒度的,提高共享资源并发行的方式就是让锁更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源,因此要进行精确的锁定。但是由于加锁也需要消耗资源,包括获得锁、检查锁是否解除、释放锁等,都会增加系统的开销。所谓的锁策略就是要在锁的开销和数据的安全性之间寻求平衡,这种平衡也会影响性能。

每种MySQL存储引擎都有自己的锁策略和锁粒度,最常用的两种重要的锁策略分别是表锁和行锁。

表锁是开销最小的策略,会锁定整张表,用户对表做写操作时,要先获得写锁,这会阻塞其它用户对该表的所有读写操作。没有写锁时,其它读取的用户才能获得读锁,读锁之间是不相互阻塞的。行锁可以最大成都支持并发处理,但也带来了最大的锁开销,它只对指定的记录加锁,其它进程还是可以对同一表中的其它记录进行操作。表级锁速度快,但冲突多,行级锁冲突少,但速度慢。

innoDB存储引擎(默认存储引擎)

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键

  1. 设计遵循ACID模型,支持事务,具有从服务崩溃中恢复数据的能力,能够最大限度包含用户的数据,默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
  2. 支持行级锁,可以提升多用户并发时的读写性能
  3. 支持外键,保持数据的一致性和完整性
  4. innoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中
  5. 配合一些热备工具可以支持在线热备份;

MyISAM存储引擎

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

  1. 默认MyISAM的表会在磁盘中产生三个文件:.frm、.MYD和.MYI
  2. 可以在创建表的时候指定数据文件和索引文件存储位置
  3. MyISAM单表最大支持的数据量是2的64次方条记录
  4. 每个表最多可以建立64个索引
  5. 如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B
  6. MyISAM引擎的存储格式:定长(FIXED 静态):是指字段中不包含VARCHAR\TEXTBLOB;动态(DYNAMIC):只要字段中包含VARCHAR\TEXTBLOB;压缩(COMPRESSED):myisampack创建

MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问,每一个表实际上和一个磁盘文件关联。文件是frm。

  1. 磁盘中产生一个以表名为名称的.frm文件,只保存表结构
  2. 如果关闭MySQL服务,此时数据会产生都是rr
  3. max_head_table_size默认16MB
  4. 支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;
  5. 支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;
  6. 由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;
  7. 默认使用hash索引。
  8. 查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
  9. 如果一个内部表很大,会转化为磁盘表。

CSV存储引擎

  1. CSV存储引擎字段不支持NULL,所有的列必须设置成NOT NULL
  2. CSV存储引擎不支持索引,也不支持分区
  3. .csv结尾的文件是保存数据的文件
  4. .csv结尾的文件是元信息文件,保存表的状态及存储的数据量

ARCHIVE存储引擎

  1. 适合对于不经常访问又删除不了的数据做归档储存
  2. .frm文件结构文件,.arz数据文件
  3. 插入效率很高,而且占用空间小
  4. ARCHIVE存储引擎只支持INSERT和SELECT操作,不支持UPDATE/DELECT/

存储引擎的选择

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

功 能MYISAMMemoryInnoDBArchive
存储限制256TBRAM64TBNone
支持事物NoNoYesNo
支持全文索引YesNoNoNo
支持数索引YesYesYesNo
支持哈希索引NoYesNoNo
支持数据缓存NoN/AYesNo
支持外键NoNoYesNo

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

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

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

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

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

如何选择合适的存储引擎?  选择标准可以分为:

  1. 是否需要支持事务;
  2. 是否需要使用热备;
  3. 崩溃恢复:能否接受崩溃;
  4. 是否需要外键支持;

然后按照标准,选择对应的存储引擎即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值