MySQL 支持多种类型的数据库引擎,可分别根据各个引擎的功能和特性为不同的数据库处理任务提供各自不同的适应性和灵活性。在 MySQL 中,可以利用 SHOW ENGINES 语句来显示可用的数据库引擎和默认引擎。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES语句查看系统所支持的引擎类型
不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。
功能 |
MylSAM |
MEMORY |
InnoDB |
Archive |
存储限制 |
256TB |
RAM |
64TB |
None |
支持事务 |
No |
No |
Yes |
No |
支持全文索引 |
Yes |
No |
No |
No |
支持树索引 |
Yes |
Yes |
Yes |
No |
支持哈希索引 |
No |
Yes |
No |
No |
支持数据缓存 |
No |
N/A |
Yes |
No |
支持外键 |
No |
No |
Yes |
No |
nnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。
MyISAM 是基于 ISAM 的存储引擎,并对其进行扩展,是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。
MEMORY 存储引擎将表中的数据存储到内存中,为查询和引用其他数据提供快速访问。
4.可以根据以下的原则来选择Mysql存储引擎
如果要提供提交,回滚和恢复的事务安全能力,并要求实现并发控制,inniDB是一个很好的选择
如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果
如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。
这里我选择两个比较重点的存储引擎实验下速度之类的性能,对比一下看看。
create database test;
use test;
create table tm(id int(20) primary key auto_increment,name char(30)) engine=myisam;
create table ti(id int(20) primary key auto_increment,name char(30)) engine=innodb;
mysql> show create table tm\G
mysql> show create table ti\G
2:插入一千万数据,来比较两个存储引擎的存储效率:我们要创建一个存储过程
(1).设置sql语句结束符
MySQL> delimiter $
//delimiter$语句是设置SQL语句的结束符为"$"
(2)创建两个存储过程
mysql> create procedure insertm()
begin
set @i=1;
while @i<=10000000
do
insert into tm(name) values(concat("wy",@i));
set @i=@i+1;
end while;
end
$
mysql> create procedure inserti()
begin
set @i=1;
while @i<=10000000
do
insert into ti(name) values(concat("wy",@i));
set @i=@i+1;
end while;
end
$
msql>delimiter ;
//delimiter ;语句是设置sql语句的结束符为“;”
//换个表名,insertm>m该成i
插入(一千万条)MyIsam存储引擎的表中的时间如下:
mysql> call insertm;
Query OK, 0 rows affected (2 min 49.74 sec)
插入(一千万条)InnoDB存储引擎的表中的时间如下:
mysql> call inserti;
Query OK, 0 rows affected (47 min 32.96 sec)
//比较结果:
Mylsam 存储引擎在写入方面有优势
MariaDB [test]> desc select count(*) from ti\G;
MariaDB [test]> desc select count(*) from tm\G;
//MyIsam使用专门的MYD表存储数据,所以这里没有查询结果
//MyISAM存储引擎会是数据表生成3个文件:
//frm文件存储表的定义、MYD文件是数据文件、MYI文件是索引文件
MariaDB [test]> select * from tm where name>"wy100" and name <"wy10000000";
MariaDB [test]> select * from ti where name>"wy100" and name <"wy10000000";
select * from tm where name="wy9999999";
select * from ti where name="wy9999999";
//无索引查询MyIsam有优势
(2)有索引的列
//对于使用MyIsam存储引擎的表:
select * from tm where id>10 and id<999999;
//执行时间:
9999988 rows in set (1.88 sec)
//对于使用了InnoDB存储引擎的表:
select * from ti where id>10 and id<999999;
//执行时间:
9999988 rows in set (0.65 sec)
//有索引查询INNODB有优势
存储引擎:
innodb:64T 支持事务,B树索引,数据缓存,支持外键
myisam:256T 支持全文索引,B树索引
memory:内存, B树索引,hash索引
比较myisam和innodb处理数据的速度
读,写
读:有索引的和没有索引的
写入(无索引):myisam更快
读 (带索引):innidb更快