什么是存储引擎
存储引擎是用于存储、处理和保护数据的核心服务。利用存储引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。使用存储引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。 不同的存储引擎有其各自的特点,如存储机制、索引技巧、主键的处理、锁的粒度等特点便随着引擎的不同而变化。
MySQL支持哪些存储引擎
MySQL5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
MySQL5.5之前,默认的数据库引擎是MyISAM。5.5版本之后,MySQL引⼊了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。
可用的数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MySQL。可以通过以下指令选择或者更改表使用的数据库引擎(在5.6及以后)。
show engines; //查看当前系统里的数据库引擎
//可以在mysql.ini里设置默认存储引擎;
create table 表名(...)type=引擎名; //建表时指定
alter table 表名 type=引擎名; //建好表后修改
引擎详解
-
InnoDB引擎
InnoDB是一个事务型存储引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种隔离级别,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于高并发情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键)
该引擎的设计目标便是处理大容量数据的数据库系统,MySQL在运行时InnoDB会在内存中建立缓冲池,用于缓存数据及索引。
可能的缺点:
1. 该引擎不支持FULLTEXT类型的索引
2. 没有保存表的行数,在执行select count(*) from 表名 时,需要遍历扫描全表
适用场景:
1. 经常需要更新的表,适合处理多重并发的更新请求
2. 支持事务
3. 外键约束
4. 可以从灾难中恢复(通过bin-log日志等)
5. 支持自动增加列属性auto_increment
MyIsam引擎相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些,在高并发时可能会遇到瓶颈,但MyIsam引擎独立与操作系统,可以在windows及linux上使用。
可能的缺点:
不能在表损坏后恢复数据
适用场景:
1. MyIsam极度强调快速读取
2. MyIsam表中自动存储了表的行数,需要时直接获取即可
3. 适用于不需要事物支持、外键功能、及需要对整个表加锁的情形
使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。 HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。
Memory同时支持散列索引和B树索引,B树索引可以使用部分查询和通配查询,也可以使用<,>和>=等操作符方便数据挖掘,散列索引相等的比较快但是对于范围的比较慢很多
可能的缺点:
1. 要求存储的数据是数据长度不变的格式,Blob和Text类型数据不可用(长度不固定)
2. 用完表格后表格便被删除
适用场景:
1. 那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地堆中间结果进行分析并得到最终的统计结果
2. 目标数据比较小,而且非常频繁的进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小
3. 数据是临时的,而且必须立即能取出用到,于是可存放在内存中
4. 存储在Memory表中的数据如果突然间丢失的话也没有太大的关系
是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。也就是说,它将MyIsam引擎的多个表聚合起来,但是它的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。
比如:我们可能会遇到这样的问题,同一种类的数据会根据数据的时间分为多个表,如果这时候进行查询的话,就会比较麻烦,Merge可以直接将多个表聚合成一个表统一查询,然后再删除Merge表(删除的是定义),原来的数据不会影响。
任何写入到此引擎的数据均会被丢弃掉, 不做实际存储;Select语句的内容永远是空。他会丢弃所有的插入的数据,服务器会记录下Blackhole表的日志,所以可以用于复制数据到备份数据库。
适用场景:
1. 充当日志服务器
2. 验证dump file语法正确性
3. 以使用blackhole引擎来检测binlog功能所需要的额外负载
MyISAM和InnoDB区别
- 是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row- level locking)和表级锁,默认为行级锁。
- 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能⼒(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
- 是否支持外键: MyISAM不支持,而InnoDB支持。
- 是否支持MVCC :仅 InnoDB 支持。应对高并发事务, MVCC(MVCC实现)比单纯的加锁更高效;MVCC只在READ COMMITTED和REPEATABLE READ两个隔离级别下工作;MVCC可以使用乐观(optimistic)锁 和悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统一。