MySQL存储引擎介绍

  1、前言:MySQL把每个数据库保存为文件系统中数据目录下的一个子目录。数据目录由MySQL配置文件(如/etc/mysql/my.cnf)中datadir项的值(如/var/lib/mysql)定义。创建一个表时,MySQL会在与表名同名的、以.frm为后缀的文件中存储表的定义。由于使用文件系统来保存,所以大小写敏感性将依赖于具体的平台(UNIX类平台上是大小写敏感的)。每种存储引擎对表数据和索引的存储方式有所不同,但表定义是由MySQL服务器独立处理的。

  我们在test数据库中创建一个名为tmp_hanerfanxu的表:

  

  在/var/lib/mysql的test子目录里面,可以看到tmp_hanerfanxu表的.frm文件:

  

  2、几种存储引擎

  通过show table status命令可以查看表使用的存储引擎,如下图。截图中各行的含义见注释*

  

  另外,在某些实现中,通过information_schema.ENGINES表可以查看MySQL支持的或默认的存储引擎等信息:

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ENGINE             | SUPPORT | COMMENT                                                        | TRANSACTIONS | XA   | SAVEPOINTS |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

  1)MyISAM引擎

  这是历史最为悠久的存储引擎,也是MySQL默认的存储引擎

  MyISAM一般将每个表存储成两个文件:数据文件(.MYD)和索引文件(.MYI)。MyISAM的格式是通用的,用户可以在不同架构的服务器上(如Intel架构和PowerPC架构之间)相互拷贝数据文件和索引文件。

  特性:

  (1)加锁与并发:对整张表进行加锁,而不是行。在读锁定的某些情况下可以并发插入(可参考这里)。

  2)MyISAM Merge引擎

  MyISAM的变种。通过以下SQL创建一个merge表:

create table t1(id int, name varchar(255))engine=MyISAM;
create table t2(id int, name varchar(255))engine=MyISAM;
create table merge_t1_t2(id int, name varchar(255))engine=MRG_MyISAM union=(t1, t2) insert_method=last;

  

  其中,engine指定为MRG_MyISAM,union指定“要合并”的表,insert_method可取三个值:first(“插入”到merge表的数据最终会插入到union指定的第一张表)、last(“插入”到merge表的数据最终会插入到union指定的最后一张表)和no(merge表为只读)。

  MyISAM merge表本质是几个相同的MyISAM表合并成的一个虚表。删除它之后,“子表”的数据不会丢失。merge表在文件系统的结构如下:

  

  3)InnoDB引擎

  这是专为事务处理设计的一款存储引擎。它支持事务、行级锁和外键。

  4)Memory引擎

  内存表。一般来说,它要比MyISAM表快一个数量级。内存表的所有数据都保存在内存中,所以查询操作不需要涉及磁盘I/O处理。一旦系统重启,内存表的表结构仍然会保留,但原有的数据都将丢失。内存表使用表级加锁,只支持较低的写并发。另外,它不支持TEXT或BLOB字段类型,只支持固定大小行(如将VARCHAR实际存储为CHAR类型),这可能浪费不少内存。容易与内存表混淆的临时表(create temporary table):可以使用任何存储引擎。只在单个连接中可见(show tables看不到该表),当连接断开时将不复存在

  3、注释*:show table status各行的含义。

  1)Row_format:行格式。对于MyISAM表,它的值可能是Dynamic(表示表中含有可变长字段,如VARCHAR)、Fixed(表示表中的字段都是不可变长的)或Compressed(表示这是一个压缩表)。如下:

  

  myisampack打包/压缩一个MyISAM表,以使它占用更少空间(上图中压缩后的数据文件比压缩前小了74.97%)。myisampack之后,使用myisamchk -rq tmp_hanerfanxu.MYI来更新表的索引(keys)。然后,重启mysql服务器(如service mysql restart),观察到:

  

  

  压缩的MyISAM表可以拥有索引,但和数据一样是只读的。它占用更少的磁盘空间,因此可以提供更快的表处理性能。因为对于查找记录,压缩后的表将减少磁盘寻道时间和降低磁盘I/O,而因解压数据导致的系统开销并不是那么引人瞩目(压缩表内的每行是单独压缩的,只需要一行数据时,MySQL不必因此解压整个表)。它适合用在基于CD/DVD-ROM的应用,或某些嵌入式环境下的应用,因为这些应用的数据一般不会改变。

  参考资料:

  《高性能MySQL》

不断学习中。。。

原文地址:https://www.cnblogs.com/hanerfan/p/4246956.html