和大部分的数据库不同,MySQL中有一个存储引擎的概念,用户可以根据数据存储的需求来选择不同的存储引擎。本次博客就来介绍一下MySQL中的存储引擎。MySQL版本 5.7.19。

概述

MySQL的存储引擎可以看做是插件式的,用户可以根据自己的需求来选择不同的存储引擎,比如是否支持事务,如何去索引数据等。5.5之前默认使用的存储引擎是MyISAM,5.5之后改为了InnoDB。

查看当前数据库的默认存储引擎,默认是InnoDB:

mysql> show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name | Value |
+----------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
4 rows in set, 1 warning (0.00 sec)

查看当前数据库支持的存储引擎:

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.00 sec)

在创建表的时候,可以指定存储引擎,如果不指定就为默认的:

mysql> create table t1(id int,name varchar(20)) engine=MyISAM;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1 \G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

可以使用ALTER  TABLE语句修改引擎:

mysql> alter table t1 engine=innodb;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t1 \G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

各种存储引擎的特性

一、MyISAM

MyISAM在5.5之前是默认的存储引擎,优缺点如下:

优点:
1.访问的速度快,对事务完整性没有要求或者以SELECT会在INSERT为主的应用可以使用此引擎;
缺点:
1.不支持事务,不支持外键;
2.MyISAM类型的表可能会损坏,损坏后表将不能访问,可以用工具去检查(CHECK TABLE)和修复(REPAIR TABLE)。。
每个MyISAM在磁盘上存储称3个文件,其文件名都和表名相同,但是扩展名如下:

每个MyISAM在磁盘上存储称3个文件,其文件名都和表名相同,但是扩展名如下:

.frm(存储表定于)
.MYD(存储数据)
.MYI(存储索引)

MyISAM支持3种不同的存储格式:

固定长度表:每个字段都是固定的长度,容易存储和缓存,缺点是占用空间,不足字段长度会补足空格,出现故障容易恢复;
动态表:包含可变长字段,占用空间少,但是频繁的更新和删除或产生碎片,可以使用OPTIMIZE TABLE改善性能,出现故障不容易恢复;
压缩表:是用myisampack创建,占用的空间非常小。
注意事项:
如果字符串后面本来就带有空格,在返回结果的时候也会被去掉。

二、InnoDB

InnoDB在5.5之后就是默认的存储引擎了,优缺点如下:

优点:
具有提交、回滚和崩溃恢复的事务能力;
缺点:
处理效率差一些,会占用更多的磁盘空间以保留数据和索引。

特点:

1.支持自增长的列,比如id自己增加
2.外键约束,MySQL支持外键约束的只有Innodb,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

InnoDB存储表和索引有以下两种方式:

1.使用共享表空间,这种方式创建的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件
2.使用多表空间存储,这种方式创建的表的表结构依然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中,如果是个分区表,则每个分区对应单独的.ibd文件,文件名为"表名+分区名",可以在创建分区的时候指定每个分区的数据位置,以此来讲表的IO均匀分布在多个磁盘上。

注意:即便在多表空间的存储方式下,共享空间仍然是必须的,InnoDB把内部数据词典和在线重做日志放在这个文件里。

3.MEMORY

MEMORY存储引擎使用存在于内存中的内容来创建表的,优缺点如下:

优点:访问速度快,因为它的数据是放在内存中的,并且默认使用HASH索引的;
缺点:一旦服务关闭,表中的数据就会丢失。

创建MEMORY的表:

mysql> create table t2 engine=memory select sid,sname from student where sid <6;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0 mysql> select * from t2;
+-----+--------+
| sid | sname |
+-----+--------+
| 1 | 李杰 |
| 2 | 钢蛋 |
| 3 | 张三 |
| 4 | 张一 |
| 5 | 张二 |
+-----+--------+
5 rows in set (0.00 sec) mysql> show table status like 't2' \G;
*************************** 1. row ***************************
Name: t2
Engine: MEMORY
Version: 10
Row_format: Fixed
Rows: 5
Avg_row_length: 101
Data_length: 126984
Max_data_length: 16293219
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-09-24 23:57:59
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

在给MEMORY创建索引的时候可以指定是HASH索引还是BTREE索引:

mysql> create index mem_hash using btree on t2(sname);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> show index from t2 \G;
*************************** 1. row ***************************
Table: t2
Non_unique: 1
Key_name: mem_hash
Seq_in_index: 1
Column_name: sname
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)

如果要释放表,直接删除表的内容是用DELETE FROM或者TRUNCATE TABLE,删除表使用DROP TABLE即可。

4.MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM的表必须结构是完全的相同的,MERGE表在磁盘上保留两个文件,文件以表的名字开始,一个.frm文件存储表定义,另一个是.MRG文件包含了组合表的信息。

因为MERGE表时多个表组成的,对于MERGE表的插入操作,要通过设置INSERT_METHOD来定义:

INSERT_METHOD=FIRST #当在MERGE中插入的时候,只插在第一个表上;
INSERT_METHOD=LAST #当在MERGE中插入的时候,只插在最后一个表上;
INSERT_METHOD=NO #此MERGE表不允许被插入。

当DROP MERGE表的时候,不会对组合表中的表有任何影响。

比如来创建一个MERGE表:

(1)创建m1,m2,m3表且m3表时前面两个表的MERGE表:

mysql> create table m1(id int,name varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.01 sec) mysql> create table m2(id int,name varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.01 sec) mysql> create table m3(id int,name varchar(20)) engine=merge union(m1,m2) insert_method=last;
Query OK, 0 rows affected (0.01 sec)

(2)在m1和m2中插入数据,并查看:

mysql> insert into m1(id,name) values(1,'frank');
Query OK, 1 row affected (0.00 sec) mysql> insert into m2(id,name) values(1,'rose');
Query OK, 1 row affected (0.00 sec) mysql> select * from m1;
+------+-------+
| id | name |
+------+-------+
| 1 | frank |
+------+-------+
1 row in set (0.00 sec) mysql> select * from m2;
+------+------+
| id | name |
+------+------+
| 1 | rose |
+------+------+
1 row in set (0.00 sec) mysql> select * from m3;
+------+-------+
| id | name |
+------+-------+
| 1 | frank |
| 1 | rose |
+------+-------+
2 rows in set (0.00 sec)

当在m1和m2上插入数据的时候,merge表中也会同步增加行,下面在m3中插入行:

mysql> insert into m3(id,name) values(2,'alex');
Query OK, 1 row affected (0.00 sec) mysql> select * from m1;
+------+-------+
| id | name |
+------+-------+
| 1 | frank |
+------+-------+
1 row in set (0.00 sec) mysql> select * from m2;
+------+------+
| id | name |
+------+------+
| 1 | rose |
| 2 | alex |
+------+------+
2 rows in set (0.00 sec) mysql> select * from m3;
+------+-------+
| id | name |
+------+-------+
| 1 | frank |
| 1 | rose |
| 2 | alex |
+------+-------+
3 rows in set (0.00 sec)

m3中成功被添加,m1中并没有被添加新行,因为这里的insert_method为last,所以只有最后的表才会被更新。

除了MySQL自带的存储引擎,还有一些第三方的存储引擎,比如Infobright、TokuDB等。

 

对比和选择

如下表:

选择建议:

1.MyISAM:如果应用是以读操作或者和插入操作为主,只有很少的更新和删除操作,并对事务的完整性和并发要求不是很高,可以选择,比如Web和数据仓库;

2.InnoDB:用于事务处理的应用,支持外键。对于类型计费系统或者财务系统等对数据准确性较高的可以使用InnoDB。
 
参考数据:《深入浅出MySQL》 推荐~
 

MySQL之存储引擎(表类型)的选择的更多相关文章

  1. MySQL 存储引擎的类型以及选择

    针对MySQL,数据最终以什么样的形式保存?以及数据保存在硬盘的什么位置? 1.MySQL的存储引擎 MySQL属于数据管理系统(DBMS),其中包括数据库,负责存储数据:还有数据库访问管理的接口系统 ...

  2. MySQL数据库 存储引擎,创建表完整的语法,字段类型,约束条件

    1.存储引擎 - 存储引擎是用于根据不同的机制处理不同的数据. - 查看mysql中所有引擎: - show engines; - myisam: 5.5以前老的版本使用的存储引擎 - blackho ...

  3. MySql(一)表类型(存储引擎)

    MySql(一)表类型(存储引擎) 一.MYSQL存储引擎概述 二.存储引擎的特性对比 2.1 MyISAM 2.2 InnoDB 2.2.1 自动增长列 2.2.2 外键约束 2.2.3 存储方式 ...

  4. mysql数据库 myisam数据存储引擎 表由于索引和数据导致的表损坏 的修复 和检查

    一.mysqlcheck 进行表的检查和修复 1.检查mysqlisam存储引擎表的状态 #mysqlcheck -uuser -ppassword database  table  -c  #检查单 ...

  5. MySQL常用存储引擎及如何选择

    一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...

  6. MySql中存储引擎MyISAM与InnoDB区别于选择

    InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...

  7. [转帖]mysql常用存储引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介绍与如何选择

    mysql常用存储引擎(InnoDB.MyISAM.MEMORY.MERGE.ARCHIVE)介绍与如何选择原创web洋仔 发布于2018-06-28 15:58:34 阅读数 1063 收藏展开 h ...

  8. Mysql不同存储引擎的表转换方法

    Mysql不同存储引擎的表转换方法 1.Alter table直接修改表的存储引擎,但是这样会导致大量的系统开销,Mysql为此要执行一个就表向新表的逐行复制.在此期间,转换操作可能会占用服务器的所有 ...

  9. MySQL各存储引擎

    MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或 ...

随机推荐

  1. 不可逆转(SDOI2010地精部落)

    提供一个简单一点的思路,不需要滚动数组,也不需要一些奇奇怪怪的性质. 我们考虑设\(f[i]\)为\(1\)到\(i\)中有多少种波动数列. 我们可以注意到,波动数列分为先降后升和先升后降两种,但是我 ...

  2. pos机代理行业

        传统模式(代理):代理商线性分润,代理商或营运商给一代大量的机器及要求,而且这个要求公对公结算(必须要有公司),分润也是直接给一代.然后一代找二代推广,层层发展.这样你会很担心你的上家的上家突 ...

  3. LeetCode 刷题指南(1):为什么要刷题

    虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会.现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 ...

  4. leecode刷题(13) -- 字符串中的第一个唯一字符

    leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...

  5. heap与stack的区别

    java 的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这 ...

  6. PyQt5(2)——调整布局(布局管理器)第一个程序

    我们拖拽一个UI文件,转为PY文件后生成一个类Ui_MainWindow 此时,我们新建一个文件,用来控制业务逻辑(继承界面中的类),跟界面分开,这样我们就完成了界面和逻辑相分离(这段代码使用率基本1 ...

  7. TX 下常用的查询指令

    查看Jetson TX2 L4T版本 head -n 1 /etc/nv_tegra_release 查看系统版本 cat /etc/lsb-release 查看系统l内核 uname -a 查看内存 ...

  8. Intellij IDEA 封装Jar包(提示错误: 找不到或无法加载主类)

    封装的过程如下: 然后准备打包 选择Build或者ReBuild即可. 但这样就会引起开始第一个图的问题.提示无法加载主类,另外一个情况就是所有的外部第三方jar包都被封装到一个jar包里面了. 那么 ...

  9. java面向对象之封装性

    面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...

  10. POJ_1990 MooFest 【树状数组】

    一.题面 POJ1990 二.分析 一个简单的树状数组运用.首先要把样例分析清楚,凑出57,理解一下.然后可以发现,如果每次取最大的v就可以肆无忌惮的直接去乘以坐标差值就可以了,写代码的时候是反着来的 ...