MySQL高级 - 存储引擎

102 阅读4分钟

「这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

存储引擎 介绍

  • 什么是存储引擎
    • 百度百科

image.png

存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。就像汽车的发动机一样,存储引擎好坏决定的数据库提供的功能和性能

  • 存储引擎的作用
    • 并发性
    • 事务支持
    • 引用完整性
    • 索引支持

常见的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表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

如何选择存储引擎

不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。

特性InnoDBMyISAMMEMORY
存储限制(Storage limits)64TBNoYES
支持事物(Transactions)YesNoNo
锁机制(Locking granularity)行锁表锁表锁
B树索引(B-tree indexes)YesYesYes
哈希索引(Hash indexes)YesNoYes
外键支持(Foreign key support)YesNoNo
存储空间消耗(Storage Cost)
内存消耗(Memory Cost)
批量数据写入效率(Bulk insert speed)
  • 提供几个选择标准,然后按照标准,选择对应的存储引擎
    • 是否需要支持事务
    • 崩溃恢复,能否接受崩溃
    • 是否需要外键支持
    • 存储的限制
    • 对索引和缓存的支持