MySQL 之 表的存储引擎
1、什么是存储方式、存储机制(存储引擎)
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,能够获得额外的速度或者功能,从而改善应用的整体功能。
例如,如果研究大量的临时数据,也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储信息、如何检索这些信息以及需要数据结合什么性能和功能的时候可以提供最大的灵活性。
选择如何存储和检索数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。
其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着要么就牺牲一些性能,要么就用几个小时甚至几天的时间详细调整数据库。而使用MySQL,仅需要修改所使用的存储引擎就可以了
2、mysql支持哪些存储引擎
mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。
其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
3、常用存储引擎特点
MySQL服务器采用了多层设计和独立模块,插件式存储引擎体系结构,允许将存储引擎加载到正在运行的MySQL服务器中,采用MySQL服务器体系结构,由于在存储级别上提供了一致和简单的应用模型和API,应用程序编程人员和DBA可不再考虑所有的底层实施细节。因此,尽管不同的存储引擎具有不同的能力,应用程序是与之分离的。存储引擎就司职与文件系统打交道了。
# 存储引擎特性
并发性:某些应用程序比其他应用程序具有很多的颗粒级锁定要求(如行级锁定)。
事务支持:并非所有的应用程序都需要事务,但对的确需要事务的应用程序来说,有着定义良好的需求,如ACID兼容等。
引用完整性:通过DDL定义的外键,服务器需要强制保持关联数据库的引用完整性。
物理存储:它包括各种各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。
索引支持:不同的应用程序倾向于采用不同的索引策略,每种存储引擎通常有自己的编制索引方法,但某些索引方法(如B-tree索引)对几乎所有的存储引擎来说是共同的。
内存高速缓冲:与其他应用程序相比,不同的应用程序对某些内存高速缓冲策略的响应更好,因此,尽管某些内存高速缓冲对所有存储引擎来说是共同的(如用于用户连接的高速缓冲,MySQL的高速查询高速缓冲等),其他高速缓冲策略仅当使用特殊的存储引擎时才唯一定义。
性能帮助:包括针对并行操作的多I/O线程,线程并发性,数据库检查点,成批插入处理等。
其他目标特性:可能包括对地理空间操作的支持,对特定数据处理操作的安全限制等。
(1)、innodb :
索引 + 数据 表结构 数据的持久化存储
事务 : 一致性 n条语句的执行状态是一致的
begin; # 开启事务
select id from innot where id =1 for update;
update innot set id = 2 where id = 1;
commit; # 提交事务 解锁被锁住的数据,让它们能够被修改
行级锁:只对涉及到修改的行加锁,利于并发的修改,但是对于一次性大量修改效率低下
外键约束:被约束表中的数据不能随意的修改/删除, 约束字段要根据被约束表来使用数据
(2)、myisam :
索引 数据 表结构 数据的持久化存储
表级锁:一次性加一把锁就锁住了整张表,不利于并发的修改,但是加锁速度比行锁的效率更高
(3)、memory :
表结构
数据断电消失
4、指定所创建表的存储引擎
# 在新建表时指定
create table innot(id int) engine = innodb; # 创建一个表innot使用innodb存储引擎
create table myist(id int) engine = myisam; # 创建一个表myist使用myisam存储引擎
create table memot(id int) engine = memory; # 创建一个表memot使用memory存储引擎
# 在配置文件中指定
# my.ini文件
[mysqld]
default-storage-engine=INNODB
5、常用存储引擎及适用场景
# InnoDB
用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
# MyISAM
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
# Memory
将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
5、存储引擎在mysql中的使用
# 查看当前的默认存储引擎:
mysql> show variables like "default_storage_engine";
# 查询当前数据库支持的存储引擎:
mysql> show engines \G;