数据库存储引擎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。
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 TABLE
或myisamchk工具最后一次检查表的时间。
Collation: 表的默认字符集和字符排序规则。
Checksum: 若是启用,则对整个表的内容计算时的校验和。
Create_options:指表建立时的其余全部选项。
Comment:包含了其余额外信息,对于MyISAM引擎,保存的是表建立时带的注释;若是表使用的是innoDB引 擎 ,则保存的是表空间的剩余空间信息;若是是一个视图,则包含了“VIEW”的文本字样。
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) | 不可能 | 不可能 | 不可能 |
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压缩表适合那些建立并导入数据后,再也不进行修改操做的数据表。可使用myisampack
对MyISAM表进行压缩,压缩后不能修改,除非先将表解压后修改数据,而后再压缩。压缩后,减小了磁盘空间占用,所以减小了磁盘I/O,从而提高查询性能。压缩表支持可读索引。
MyISAM最典型的性能问题是表锁的问题,若是发现全部查询都长期处于“Locked”状态,那么就表锁的问题。
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储存引擎
Memory储存引擎
该引擎把数据表保存在内存中,数据表具备固定不变的数据行,所以它的检索很是快,可是服务器断电时,表的内容也随之消失。若是须要快速访问数据,并且这些数据不会被修改,重启后丢失也不要紧,能够考虑使用Memory存储引擎。
特色:
适合使用的场景:
Falcon储存引擎
NDB储存引擎
该引擎是MySQL的集群储存引擎。
查看有哪些存储引擎可用
mysql> SHOW ENGINES\G;
查询默认存储引擎
mysql> SHOW VARIABLES LIKE 'default_storage_engine%';
查询数据表的相关信息
mysql> SHOW TABLE STATUS LIKE 'user'\G;