能够在 mysql 客户端中,使用 show engines;
命令能够查看MySQL支持的引擎:mysql
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.06 sec)
InnoDB 是 MySQL 默认的存储引擎,也是最重要、使用最普遍的存储引擎。
InnoDB 的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。
除非有很是特别的缘由须要使用其余的存储引擎,不然应该优先考虑 InnoDB 引擎。web
select count(*) from table
时须要全表扫描。使用共享表空间存储: 表结构保存在 .frm
文件中,数据和索引在 innodb_data_home_dir
和 innodb_data_file_path
定义的表空间中,能够是多个文件。
使用多表空间存储: 表结构保存在 .frm
文件中,每一个表的数据和索引单独保存在 .ibd
中。sql
更新密集的表: InnoDB存储引擎特别适合处理多重并发的更新请求。
事务: InnoDB存储引擎是支持事务的标准MySQL存储引擎。
自动灾难恢复: InnoDB表可以自动从灾难中恢复。
外键约束: MySQL支持外键的存储引擎只有InnoDB。
支持自动增长列 AUTO_INCREMENT 属性。shell
MyISAM 是 MySQL 5.1 及以前版本的默认存储引擎。MySQL 8 即将废弃 MyISAM 引擎。
MyISAM 提供了全文索引、压缩、空间函数(GIS)等特性。
MyISAM 不支持事务和行级锁,崩溃后没法安全恢复。数据库
select count(*) from table
时只须要读出该变量便可,速度很快。MyISAM 的三种存储格式分别为静态、动态和压缩。MyISAM 会根据表的定义自动选择存储格式。缓存
静态表: 若是数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。由于数据表中每一条记录所占用的空间都是同样的,因此这种表存取和更新的效率很是高。当数据受损时,恢复工做也比较容易作。
动态表: 若是数据表中出现 varchar
、*text
或 *BLOB
字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但因为每条记录的长度不一,因此屡次修改数据后,数据表中的数据就可能离散的存储在内存中,进而致使执行效率降低。同时,内存中也可能会出现不少碎片。所以,这种类型的表要常常用 optimize table
命令或优化工具来进行碎片整理。
压缩表: 以上说到的两种类型的表均可以用myisamchk工具压缩。若是表在建立并导入数据后,不在进行修改操做,这样的表适合采用 MyISAM 压缩表。这种类型的表进一步减少了占用的存储,可是这种表压缩以后不能再被修改。另外,由于是压缩数据,因此这种表在读取的时候要先时行解压缩。安全
每一个 MyISAM 表在磁盘上存储成三个文件,每个文件的名字均以表的名字开始,扩展名指出文件类型。 .frm
文件存储表结构定义。 .MYD
(MYData) 文件存储表的数据。 .MYI
(MYIndex) 文件存储表的索引。服务器
查询密集型表: MyISAM 存储引擎在筛选大量数据时很是快,是它最突出的优势;
插入密集型表: MyISAM 的并发插入特性容许同时选择、插入数据。例如:MyISAM存储引擎很是适合管理邮件或Web服务器日志数据。并发
MEMORY 引擎(也叫 HEAP 引擎),将全部数据都保存在内存中,不须要进行磁盘I/O。所以,MEMORY表至少比 MyISAM 表快一个数量级。
MySQL 重启或 mysqld 守护进程崩溃时,Memory 表的结构还会保留,可是全部的数据都会丢失。app
得到速度的同时也带来一些缺陷。它要求存储在Memory数据表里的数据用的是长度不变的格式,这意味着不能用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是种长度可变的类型,但由于它在MySQL内部当作长度固定不变的CHAR类型,因此可使用。
ARCHIVE 引擎是一个针对插入和压缩作了优化的简单存储引擎。
ARCHIVE 引擎只支持 INSERT 和 SELECT 操做。MySQL 5.1 以前也不支持索引。
ARCHIVE 引擎会利用 zlib 对插入的行进行压缩,因此比 MyISAM 表的磁盘 I/O 更少。
MERGE 存储引擎是 MyISAM 引擎的变种。MERGE 表是由多个 MyISAM 表合并而来的虚拟表,这些MyISAM表结构必须彻底相同。Merge表中并无数据,对Merge类型的表能够进行查询、更新、删除操做,这些操做其实是对内部的MyISAM表进行操做。
Merge存储引擎使用场景对于服务器日志这种信息,通常经常使用的存储策略是将数据分红不少表,每一个名称与特定时间端相关。例如:能够用12个相同的表来存储服务器的日志数据,每一个表用对应各个月份的名字来命名。当有必要基于全部12个日志表的数据来生成报表时,这意味着须要编写、更新多表查询,以反映这些表中的信息。与其编写这些可能会出现错误的查询,不如将这些表合并起来使用一条查询,以后再删除Merge表而不影响原来的数据,删除Merge表只会删除掉Merge表的定义,对内部表没有任何影响。
可是引入分区功能后,该引擎已经被放弃。
CSV 引擎能够将普通的 CSV 文件做为 MySQL 的表来处理,可是这种表不支持索引。