常用表引擎

引擎名称

特性

MyISAM

不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。

InnoDB

支持事务处理,支持外键,支持崩溃修复能力和并发控制。

MEMORY:

所有的数据都在内存中,数据的处理速度快,但是安全性不高。

Archive

不常用。归档引擎,压缩比高达1:10,用于数据归档

MyISAM

特性

  1. MyISAM存储引擎独立于操作系统,数据文件可以跨平台使用;
  2. 采用表级锁来提供并发支持能力;
  3. 执行读取操作的速度很快,而且不占用大量的内存和存储资源;
  4. 数据和索引分开存储,减少操作系统的大文件访问情况,以提高性能;
  5. 单独存储了表的行数数据,统计行数的不用遍历数据;
  6. 不支持事务,只支持表锁

存储结构

查看数据存放路径

show global variable like “%datadir%”;

存储表结构文件:.frm
索引文件: 表名.MYI
数据文件: 表名.MYD

适用场景

  1. 不需要事务支持的场景,或者有事务需求但是系统在service层自行实现事务支持的场景;
  2. 需要做很多count计算的场景;
  3. 插入不频繁,查询非常频繁的场景;
  4. 不要考虑灾难恢复的场景,不要记录binlog,减少IO操作,可大幅提升性能;
  5. MySQL以前的版本默认的数据库引擎是MyISAM,现在是InnoDB
    Mysql8.0官方废弃MyISAM

InnoDB

特点

  1. 如果服务器意外宕机了,只需要重启数据库即可。InnoDB 意外恢复自动完成在意外之前没有提交的操作
  2. InnoDB 存储引擎拥有独自的缓存池,缓存池缓存表数据和索引数据在内存中,使得使用数据可以像在内存中一样。在专用于数据存储的服务器中,建议分配百分之八十的内存给缓存池
  3. 在实行分表时,可以设置相关的外键来实现参照完整,更新或删除数据,相关的数据也将会被自动的更新或删除,
  4. 如果在磁盘或内存的数据损坏,InnoDB 校验机制在你使用此数据之前会提醒你数据异常
  5. 插入,更新,删除操作会被更新缓存执行,你可以同时对同一张表读和写,InnoDB 会缓存更新的数据至磁盘
  6. 当表中同一行数据经常被查询,Adaptive Hash Index 帮助这些查询更快,但只存在于内存中,停库则丢失,重启后需要重新建立

AHI

hash index
哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1),常用于连接(join)操作,如SQL Server和Oracle中的哈希连接(hash join)。但是SQL Server和Oracle等常见的数据库并不支持哈希索引(hash index)。MySQL的Heap存储引擎默认的索引类型为哈希,而InnoDB存储引擎提出了另一种实现方法,自适应哈希索引(adaptive hash index)
自适应哈希
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。

根据InnoDB的官方文档显示,启用自适应哈希索引后,读取和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍,使得InnoDB获得了非常好的优化模式。

Adaptive Hash Index是针对B+树Search Path的优化,因此所有会涉及到Search Path的操作,均可使用此Hash索引进行优化,这些可优化的操作包括:Unique Scan/Range Scan(Locate First Key Page)/Insert/Delete/Purge等等,几乎涵盖InnoDB所有的操作类型

Adaptive,意味着不是所有的叶页面都会以Hash索引维护,叶页面进入Hash 索引的条件是:同种类型的操作(Scan/Insert…),命中同一叶页面的次数,超过此页面记录数量的1/16,则可将当前叶页面加入Hash索引, 用以优化后续可能的相同Search Path。

存储结构

存储表结构:.frm
存储索引和数据:.ibd
InnoDB 逻辑存储单元主要分为表空间,段,区,页。

层级关系为tablespace -> segment-> extent (64 个 page ,1mb)->page.

mysql table引擎 mysql表引擎作用_mysql table引擎

InnoDB 存储引擎表中所有数据都是存在表空间中。表空间包括(系统表,独立表,通用表,临时表)

应用场景

在实际场景中,针对具体问题需要具体分析,一般而言可以遵循以下几个问题:

  • 数据库是否有外键?
  • 是否需要事务支持?
  • 是否需要全文索引?
  • 数据库经常使用什么样的查询模式?(在写多读少的应用中还是Innodb插入性能更稳定,在并发情况下也能基本,如果是对读取速度要求比较快的应用还是选MyISAM)
  • 数据库的数据有多大?(大尺寸倾向于innodb,因为事务日志,故障恢复)

MEMORY的简单介绍

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的

总结

  1. MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  2. InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERTUPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能