MySQL 的存储引擎

数据库存储引擎storage engine,又称数据表处理器,它是数据库底层软件的组织。数据库管理系统(DBMS)使用数据引擎进行建立、查询、更新和删除数据。不一样的存储引擎提供不一样的存储机制、索引技巧、锁定水平等功能,使用不一样的存储引擎,还能够 得到特定的功能。mysql

数据表在硬盘上的存储方式

在文件系统中,MySQL将每一个数据库 (也称schema)保存为数据目录下的一个子目录。建立表时,MySQL会在数据库子目录下建立一个与表同名的.frm文件保存表的定义。sql

MySQL使用文件系统的目录来保存数据库和表的定义,大小写敏感性与具体的操做系统的文件系统相关。在Windows中,大小写不敏感;而在Uinux/Linux中则是大小写敏感。数据库

不一样的储存引擎保存数据和索引的方式是不一样的,但表的定义在MySQL服务器层是统一处理的。缓存

查看有哪些存储引擎可用安全

mysql> SHOW ENGINES\G;

查看有哪些存储引擎可用

查询默认存储引擎服务器

mysql> SHOW VARIABLES LIKE 'default_storage_engine%';

查询默认存储引擎

查询数据表的相关信息并发

mysql> SHOW TABLE STATUS LIKE 'user'\G;

查询数据表的相关信息

下面简单介绍每一行的含义:app

Name: 表名。函数

Engine:表的存储引擎类型。高并发

Row_format:行的格式。可选值有 Dynamic、Fixed或者Compressed。

  • Dynamic: 行的长度可变,通常包含可变长度的字段,如VARCHAR或者BLOB。
  • Fixed:行的长度是固定,只包含固定长度的列,如CHAR、INTEGER。
  • Compressed:行存在压缩表中。

Rows:表中的行数。

Avg_row_length:平均每行包含的字节数。

Data_length:整个表的大小(单位:字节)。

Max_data_length: 表能够容纳的最大数据量

Index_length:索引的大小(单位:字节)。

Data_free: 对于MyISAM表,表示已经分配但目前没有使用的空间。这部分空间包括以前删除的行,以及后续可 以被INSERT利用到的空间。

Auto_increment:下一个Auto_increment的值。

Create_time: 表的建立时间。

Update_time:表数据的最后修改时间。

Check_time: 使用 CHECK TABLEmyisamchk工具最后一次检查表的时间。

Collation: 表的默认字符集和字符排序规则。

Checksum: 若是启用,则对整个表的内容计算时的校验和。

Create_options:指表建立时的其余全部选项。

Comment:包含了其余额外信息,对于MyISAM引擎,保存的是表建立时带的注释;若是表使用的是innoDB引 擎 ,则保存的是表空间的剩余空间信息;若是是一个视图,则包含了“VIEW”的文本字样。

InnoDB存储引擎

InnoDB是MySQL的默认事务引擎,也是目前最重要、使用最普遍的存储引擎。它被设计用来处理大量的短时间事务(大部分状况能正常提交,不多被回滚)。同时,InnoDB的性能和崩溃自动恢复特性使得它在非事务型储存的需求中也被普遍使用。若非有特别缘由须要使用其余的储存引擎,建议优先考虑InnoDB引擎。

概述

InnoDB的数据存储在表空间(tablespace)中,表空间是由一系列的数据文件构成,相似一个虚拟的文件系统,它存储和管理全部InnoDB数据表内容。

InnoDB 采用MVCC支持高并发,且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ,且经过间隙锁策略防止幻读的出现。间隙锁使得InnoDB不只锁定查询涉及的行,还会对索引中的间隙进行锁定,防止幻影行的插入。

InnoDB表基于聚蔟索引创建的,其索引结构和MySQL的其余存储引擎有很大不一样,聚蔟索引对主键查询有很高的性能。它的二级索引必须包含主键列,因此主键很大的话,其余索引也会很大。所以若表上的索引比较多,主键应当尽量小。

四种隔离级别说明

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(SERIALIZABLE) 不可能 不可能 不可能
  • 脏读 :一个事务读取到另外一事务未提交的更新数据。
  • 不可重复读 : 在同一事务中,屡次读取同一数据返回的结果有所不一样, 换句话说, 后续读取能够读到另外一事务已提交的更新数据. 相反, “可重复读”在同一事务中屡次读取数据时, 可以保证所读数据同样, 也就是后续读取不能读到另外一事务已提交的更新数据。。
  • 幻读 :一个事务读到另外一个事务已提交的insert数据。

提供的功能

  • 支持提交和回滚操做,还能够建立保存点实现部分回滚。
  • 在系统奔溃后可自动恢复。
  • 外键和引用完整性支持,包括递归式删除和更新。
  • 数据行级别的锁定和多版本共存,使得InnoDB数据表在同时检索和更新操做的复杂查询中表现出很是好的并发性能。
  • 默认状况下,InnoDB储存引擎会把数据表存储在一个共享的表空间里,表空间可由多个文件构成,相似一个虚拟的文件系统,它存储和管理全部InnoDB数据表内容。

MyISAM 存储引擎

MyISAM是MySQL 5.1 以及以前版本的默认存储引擎,它提供了全文检索、压缩、空间压缩函数等特性。MyISAM不支持事务和行级锁,崩溃后没法安全恢复。若是对于只读数据,或者表比较小,能够忍受修复操做,也能够考虑存储引擎选用MyISAM。

存储

MyISAM将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。

MyISAM表能够包含动态或者静态(长度固定)行。

MyISAM表的存储记录数受限于可用的磁盘空间或者操做系统中单个文件的最大尺寸。

特性

加锁与并发

MyISAM对整表加锁,而不是针对行。读取时会对须要读到的全部表加共享锁,写入时会对表加排他锁。若表有读取查询时,能够往表中插入新的记录,称之为并发插入。

修复

MySQL可手工或者自动执行检查和修复的操做。执行表的修复可能会致使一些数据的丢失,并且过程很是 慢。

可经过CHECK TABLE mytable检查表的错误,若是有错误可经过REPAIR TABLE mytable命令修复。若是MySQL服务器已经关闭,可使用myisamchk命令进行检查和修复的操做。

索引特性

支持全文检索,这是一种基于分词建立的索引,能够支持复杂的查询。

延迟更新索引键

建立MyISAM表时若指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会马上将修改的索引写入磁盘,而是写到内存中的键缓冲区,在清理缓冲区或者关闭表的时候才会把对应的索引块写入到磁盘。此方式极大提高了写入性能,可是在数据库或者主机崩溃时会形成索引损坏,须要执行修复操做。延迟更新索引键能够在全局设置,也能够为单表设置。

MyISAM压缩表

MyISAM压缩表适合那些建立并导入数据后,再也不进行修改操做的数据表。可使用myisampack对MyISAM表进行压缩,压缩后不能修改,除非先将表解压后修改数据,而后再压缩。压缩后,减小了磁盘空间占用,所以减小了磁盘I/O,从而提高查询性能。压缩表支持可读索引。

MyISAM 性能

MyISAM最典型的性能问题是表锁的问题,若是发现全部查询都长期处于“Locked”状态,那么就表锁的问题。


MySQL内建的其余存储引擎简介

Archive 引擎

Archive只支持INSERT和SELECT操做,它会缓存全部的写并对插入的行进行行压缩,所以它比MyISAM表的磁盘I/O 更少。Archive引擎每次SELECT查询须要执行全表扫描,它适合日志和数据采集类应用,由于这类应用作数据分析时候须要全表扫描。同时也适合须要更快INSERT操做的场合下使用。

Archive支持行级锁和专用缓冲区,能够实现高并发插入。在一个查询开始直到返回表中存在的全部行数以前,它会阻止其余SELECT执行,以实现读一致性。Archive在操做批量插入时,在完成前对读操做是不可见,此机制模仿了事务和MVCC的一些特性,可是它不是一个事务型引擎,而是一个针对高速插入和压缩作了优化的简单引擎。

Blackhole引擎

Blackhole引擎没有实现任何存储机制,它会丢弃全部插入的数据,不作任何保存。可是服务器会记录Blackhole表的日志,因此它适合用于复制数据到备库,或简单地记录到日志。

CSV引擎

CSV引擎能够将CSV文件做为MySQL的表来处理,但它不支持索引。CSV引擎能够在数据库运行适合拷入或拷出文件,能够把Excel等电子表格中的数据存储为CSV文件,而后复制到M一SQL数据目录下,就能在MySQL中打开。

Federated存储引擎

Federated引擎是访问其余MySQL服务器饿一个代理,它建立一个到远程MySQL服务器的客户端链接,并将查询传输到远程服务器执行,而后提取或者发送须要的数据。

MERGE储存引擎

  • 该引擎提供了把多个MyISAM数据表合并为一个虚拟数据表的手段,查询一个MEGRE数据表至关于查询全部成员数据表,这种作法的好处能够绕开文件系统对各个MyISAM数据表的最大长长大限制。
  • 构成MERGE数据表的全部数据表必须具备一样的结构。
  • 该引擎适用于日志或数据仓库类应用。

Memory储存引擎

该引擎把数据表保存在内存中,数据表具备固定不变的数据行,所以它的检索很是快,可是服务器断电时,表的内容也随之消失。若是须要快速访问数据,并且这些数据不会被修改,重启后丢失也不要紧,能够考虑使用Memory存储引擎。

特色:

  • 使用散列索引,所以进行“相等比较”速度很是快,可是进行“范围比较”速度比较慢。散列索引适合使用“=”和“<=>”,不适合使用“<”和“>”,一样散列索引也不适合用在ORDER BY字句里。
  • 该引擎的数据表的数据行里使用长度固定不变的格式,以此加快处理速度。不能使用BLOB和TEXT这样长度可变的数据类型。VARCHAR是一种长度可变的类型,可是在MySQL内部被看成一种固定不变的CHAR类型。

适合使用的场景:

  • 用于查找(lookup)或者映射(mapping)表。
  • 用于缓存周期性的聚合数据的结果。
  • 用于保存数据分析中产生的中间数据。

Falcon储存引擎

  • 支持提交和回滚的操做。
  • 在系统奔溃后可自动恢复。
  • 灵活的锁定级别和多版本共存,在同时检索和更新操做的复杂查询中表现出很是好的并发性能。
  • 在储存时对数据行进行压缩,在检索时对数据行进行解压缩以节省空间。
  • 平常管理和维护开销低。

NDB储存引擎

该引擎是MySQL的集群储存引擎。

命令总结

查看有哪些存储引擎可用

mysql> SHOW ENGINES\G;

查询默认存储引擎

mysql> SHOW VARIABLES LIKE 'default_storage_engine%';

查询数据表的相关信息

mysql> SHOW TABLE STATUS LIKE 'user'\G;
相关文章
相关标签/搜索