「这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战」
存储引擎 介绍
- 什么是存储引擎
- 百度百科
存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。就像汽车的发动机一样,存储引擎好坏决定的数据库提供的功能和性能
- 存储引擎的作用
- 并发性
- 事务支持
- 引用完整性
- 索引支持
常见的3种存储引擎
- MySQL给用户提供了很多种类的存储引擎,主要分两大类
- 事务安全表:InnoDB
- 非事务安全表:MyISAM、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等。
- 查看MySQL数据的存储引擎有哪些
SHOW ENGINES;
- 查看当前的默认存储引擎(MySQL5.7默认使用InnoDB)
SHOW VARIABLES LIKE '%default_storage_engine%';
- 在MySQL中,不需要整个服务器都是用同一种引擎,针对具体的需求,可以对每一个表使用不同的存储引擎。并且想要进一步优化,还可以自己编写一个存储引擎。
-- 创建新表时指定存储引擎
create table(...) engine=MyISAM;
InnoDB
InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择
- 优点
- Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别
- 支持多版本并发控制的行级锁,由于锁粒度小,写操作和更新操作并发高、速度快。
- 支持自增长列。
- 支持外键。
- 适合于大容量数据库系统,支持自动灾难恢复。
- 缺点
- 它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表
- 应用场景
- 当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率
- 更新密集的表,InnoDB存储引擎特别适合处理多重并发的更新请求。
MyISAM
MyISAM引擎,不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表
- 优点
- MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器。
- MyISAM存储引擎在查询大量数据时非常迅速,这是它最突出的优点
- 另外进行大批量插入操作时执行速度也比较快。
- 缺点
- MyISAM表没有提供对数据库事务的支持。
- 不支持行级锁和外键。
- 不适合用于经常UPDATE(更新)的表,效率低。
- 应用场景
- 以读为主的业务,例如:图片信息数据库,博客数据库,商品库等业务。
- 对数据一致性要求不是非常高的业务(不支持事务)
- 硬件资源比较差的机器可以用 MyiSAM(占用资源少)
MEMORY
MEMORY的特点是将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的纬度表
- 优点
- memory类型的表访问非常的快,因为它的数据是放在内存中的
- 缺点
- 一旦服务关闭,表中的数据就会丢失掉。
- 只支持表锁,并发性能差,不支持TEXT和BLOB列类型,存储varchar时是按照char的方式
- 应用场景
- 目标数据较小,而且被非常频繁地访问。
- 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
- 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。
如何选择存储引擎
不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。
特性 | InnoDB | MyISAM | MEMORY |
---|---|---|---|
存储限制(Storage limits) | 64TB | No | YES |
支持事物(Transactions) | Yes | No | No |
锁机制(Locking granularity) | 行锁 | 表锁 | 表锁 |
B树索引(B-tree indexes) | Yes | Yes | Yes |
哈希索引(Hash indexes) | Yes | No | Yes |
外键支持(Foreign key support) | Yes | No | No |
存储空间消耗(Storage Cost) | 高 | 低 | 低 |
内存消耗(Memory Cost) | 高 | 低 | 高 |
批量数据写入效率(Bulk insert speed) | 慢 | 快 | 快 |
- 提供几个选择标准,然后按照标准,选择对应的存储引擎
- 是否需要支持事务
- 崩溃恢复,能否接受崩溃
- 是否需要外键支持
- 存储的限制
- 对索引和缓存的支持