一. 存储引擎介绍
1. 什么是存储引擎
存储引擎就是表的类型, 针对不同类型的表, mysql使用不同的存取机制
Copy现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
拓展:
Copy在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎
SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。
2. MySQL四种主要存储引擎介绍
Copy# InnoDB
'''
使用版本: MySQL5.5版本及之后默认的存储引擎
优点: 支持事务, 行级锁定和外键约束对数据的安全性较
半个缺点: 访问速度没有MyISAM快, 但是我们更加注重的是数据的安全.
每个InnoDB在磁盘上存储成2个文件,其中文件名和表名都相同,但是扩展名分别为:
.frm(存储表结构)
.idb(i -> index. 索引+数据组织表)
'''
# MyISAM
'''
使用版本: MySQL5.5版本之前默认的存储引擎
优点: 访问速度要比Innodb更快
缺点: 不支持事务,也不支持外键, 对事务完整性没有要求, 数据的安全性没有Innodb高.
每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
.frm(存储表结构)
.MYD(MyData,存储数据)
.MYI(MyIndex,存储索引)
'''
# MEMORY
'''
优点: 采用内存存储, 访问数据可以得到最快的响应.
缺点: 断电数据丢失. 或当mysqld守护进程崩溃时,所有的Memory数据也会丢失.
每个MEMORY在磁盘上存储成1个文件,其中文件名和表名都相同,但是扩展名分别为:
.frm(存储表结构)
'''
# BLACKHOLE
'''
特点: 无论存什么,都立刻消失(黑洞). 类似于回收站
每个BLACKHOLE在磁盘上存储成1个文件,其中文件名和表名都相同,但是扩展名分别为:
.frm(存储表结构)
'''
# MyISAM与InnoDB两个引擎的区别:
'''
<1> InnoDB支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要 哪个出错还可以回滚还原,而MyISAM就不可以了.
<2> MyISAM适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用.
<3> InnoDB支持外键,MyISAM 不支持
<4> InnoDB中不保存表的行数, InnoDB需要扫描一遍整个表来计算有多少行. MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表;
<5> 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引;
<6> 清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;
<7> InnoDB支持行锁(注意: 某些情况下还是锁整表)
'''
3. 验证: 指定不同存储引擎进行插入数据测试
Copy# 查看所有支持的存储引擎
show engines;
# 查看正在使用的存储引擎
# storage /ˈstɔːrɪdʒ/ 存储 储存 保管
show variables like 'storage_engine%';
Copydrop table innodb_t1;
drop table myisam_t1;
drop table memory_t1;
drop table blackhole;
# 创建不同的表指定不同的存储引擎
create table innodb_t1(id int) engine=innodb;
create table myisam_t1(id int) engine=myisam;
create table memory_t1(id int) engine=memory;
create table blackhole_t1(id int) engine=blackhole;
# 插入数据
insert into innodb_t1 values(1);
insert into myisam_t1 values(1);
insert into memory_t1 values(1);
insert into blackhole_t1 values(1);
# 查看
select * from innodb_t1;
select * from myisam_t1;
select * from memory_t1;
select * from blackhole_t1;
# 结果
'''
mysql> select * from innodb_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.07 sec)
mysql> select * from myisam_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.07 sec)
mysql> select * from memory_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.06 sec)
mysql> select * from blackhole_t1;
Empty set (0.07 sec)
'''
# 重启mysql或者重启机器后,表memory_t1内数据清空
service mysql restart
-- Shutting down MySQL.. [ OK ]
-- Starting MySQL. [ OK ]
mysql> select * from memory_t1;
-- Empty set (0.08 sec)