数据库存储引擎是数据库底层软件组织,数据库管理系统(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),支持行锁定和外键

设计遵循ACID模型,支持事务,具有从服务崩溃中恢复数据的能力,能够最大限度包含用户的数据

支持行级所,可以提升多用户并发时的读写性能

支持外键,保持数据的一致性和完整性

innoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中

MyISAM存储引擎

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

默认MyISAM的表会在磁盘中产生三个文件:.frm、.MYD和.MYI

可以在创建表的时候指定数据文件和索引文件存储位置,只有

MyISAM单表最大支持的数据量是2的64次方条记录

每个表最多可以建立64个索引

如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B

MyISAM引擎的存储格式:定长(FIXED 静态):是指字段中不包含VARCHAR\TEXTBLOB;动态(DYNAMIC):只要字段中包含VARCHAR\TEXTBLOB;压缩(COMPRESSED):myisampack创建

MEMORY存储引擎

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

磁盘中产生一个以表名为名称的.frm文件,只保存表结构

如果关闭MySQL服务,此时数据会产生都是rr

max_head_table_size默认16MB

CSV存储引擎

CSV存储引擎字段不支持NULL,所有的列必须设置成NOT NULL

CSV存储引擎不支持索引,也不支持分区

.csv结尾的文件是保存数据的文件

.csv结尾的文件是元信息文件,保存表的状态及存储的数据量

ARCHIVE存储引擎

适合对于不经常访问又删除不了的数据做归档储存

.frm文件结构文件,.arz数据文件

插入效率很高,而且占用空间小

ARCHIVE存储引擎只支持INSERT和SELECT操作,不支持UPDATE/DELECT/

存储引擎的选择

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

功 能

MYISAM

Memory

InnoDB

Archive

存储限制

256TB

RAM

64TB

None

支持事物

No

No

Yes

No

支持全文索引

Yes

No

No

No

支持数索引

Yes

Yes

Yes

No

支持哈希索引

No

Yes

No

No

支持数据缓存

No

N/A

Yes

No

支持外键

No

No

Yes

No

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

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

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

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

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

mysql 存储引擎_MySQL存储引擎相关推荐

  1. mysql一共有多少引擎_MySQL存储引擎你们知道多少?

    MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引 ...

  2. mysql 参照完整性规则_MySQL存储引擎你们知道多少?

    MySQL存储引擎技术详解点击观看! MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试 ...

  3. mysql模板引擎_MYSQL存储引擎解释

    存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念, ​ MySQL支持多种存储引擎,每种引擎有着一些自己独特的功能,用户在使用的时候,可以根 ...

  4. mysql集群数据引擎_MySQL数据引擎

    InnoDB存储引擎 该引擎是MySQL数据库的默认事务型引擎,它被设计用来处理大量短期事务(绝大多数正常提交,很少回滚) InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由 ...

  5. mysql .myi权限_mysql之引擎、Explain、权限详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  6. mysql merge 语句_Mysql merge引擎介绍

    一. 什么是MERGE引擎 MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询. 二. 应用场景 如果需要把日志纪录不停的录入MySQL数据库,并且每天.每 ...

  7. Mysql存储级别_mysql 存储引擎分类和事务隔离级别

    mysql 存储引擎分类 myisam和innodb的区别 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条S ...

  8. mysql常用的存储引擎_Mysql存储引擎

    什么是存储引擎? 关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式.有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取 ...

  9. mysql内存引擎_MySQL存储引擎介绍之Memory

    Memory存储引擎使用存在内存中的内容来创建表,每个Memory表只实际对应一个磁盘文件,在磁盘中表现为.frm文件.Memory类型的表访问速度非常快,因为它的数据是放在内存中的,并且默认使用ha ...

最新文章

  1. jQuery效果:隐藏、显示、切换、滑动、淡入淡出、动画
  2. 练习 hdu 5523 Game
  3. MINA2-TCP服务端实例
  4. 远程协助TeamView软件 轻松控制计算机
  5. 体验.NET Core使用IKVM对接Java
  6. 344. 反转字符串 golang
  7. 【英语学习】【English L06】U06 Banking L2 A savings account sounds better for me
  8. oracle按天创建分区,oracle 10g按天分区
  9. 若存在linux samba共享需关闭,Samba共享后不能访问是selinux惹的祸
  10. 王道 计算机网络试题讲解_王道考研 计算机网络(7)学习笔记
  11. 图纸管理软件有哪些,免费图纸管理软件
  12. c语言 程序数据要五行输出,C语言编程入门之--第三章编写第一个C语言程序
  13. Python语法概念基础
  14. vue 通过自定义规则实现表单手机号和邮箱的校验
  15. 解决网络波动数据传输问题——spring的重试机制@Retryable
  16. 性能测试基础——内存
  17. excel 批量翻译-excel 批量函数公司翻译大全免费
  18. urllib和urllib2的区别(很全面详细!)
  19. Android自定义底部带有动画的Dialog
  20. 什么是进程? 什么是线程?

热门文章

  1. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
  2. bootstrap插件(对话框)bootbox参数和自定义弹出框宽度设置
  3. HDFS基本原理及数据存取实战
  4. 变量定义类型长度的理解
  5. 项目中会用到的开源项目列表
  6. fg、bg、jobs、、ctrl + z
  7. STL map常用操作简介
  8. Ubuntu 16.04直接升级至20.04 (Upgrade from 16.04 to 20.04 directly)
  9. 10.08-vscode-plantuml建模
  10. windows和Linux查看端口占用进程并关闭