MySQL为我们提供了很多表类型供选择,有MyISAM、ISAM、HEAP、BerkeleyDB、InnoDB,MERGE表类型,萝卜白菜各有所爱是不假,可是真正选择何种表类型还是要看业务需要啊,每一种表类型都有其自己的属性和优点。下面我们来简单的讨论一下。

MyISAM表类型:

  • MyISAM表(TYPE=MYISAM)是ISAM类型的一种延伸,具有很多优化和增强的特性。
  • 是MySQL的默认表类型。
  • MyISAM优化了压缩比例和速度,并且可以很方便的在不同的操作系统和平台之间进行移植。
  • MyISAM支持大表文件(大于4G)
  • 允许对BLOB和TEXT列进行索引
  • 支持使用键前缀和使用完整的键搜索记录
  • 表数据和表索引文件可以依存在不同的位置,甚至是不同的文件系统中。
  • 即使是具有相当多的插入、更新和删除操作的表,智能防碎片逻辑也能保证其高性能的协作性。

ISAM表类型:

ISAM表(TYPE=ISAM)和MyISAM表相似,但是其没有MyISAM格式的很多增强性能,因而不能像MyISAM类型那样提供很好的优化和执行效率。因为ISAM索引不能被压缩,它比在MyISAM中的相同索引战胜较少的系统资源。ISAM索引需要较多的磁盘空间,这对于像本站的这种小型环境很是问题。呵呵。

和MyISAM一样,ISAM表可以是固定长度的,也可以是可变长度的,但是其格式的最大键长度比较小,ISAM格式处理的表不能大于4G,而且表不能在不同的平台间移植。另外,ISAM表容易分裂,这会降低查询速度,对数据/索引的压缩产生限制。

HEAP表类型:

HEAP表(TYPE=HEAP)是内存中的表,它使用能够比较快速的散列索引(当运行INSERT查询时,独立评价指出HEAP表最少比MyISAM表快30%),因此,对于临时表可以优化。经和MyISAM或ISAM表的访问规则和使用方式一样。存储在里面的数据只在MySQL服务器的生命期内存在,如果MySQL服务器崩溃或者被关掉,都会使其中的数据消失不见。虽然HEAP表具有性能方面的好处,但是由于它的临时性和一些其他功能限制,在实际中不可能经常使用。

HEAP表的大小只受到系统上可用内存的限制,MySQL是很聪明的,其具有内建保护来阻止无意识地使用所有可用内存。所以我们不用担心内存会被HEAP表用尽。HEAP表不支持BLOB或TEXT列,不能超过max_heap_table_size变量指定的大小。

BerkeleyDB表类型:

BerkeleyDB表(TYPE=BDB)是为了满足MySQL开发者对事务安全表日益增长的需求而发展起来的。BerkeleyDB表具有很多有趣的鹅,包括提交和回滚操作、多用户并发访问、检查点、次要索引、通过日志恢复崩溃、连续地和键控地访问数据等,这便利复杂的、基于事务的SQL有了可行的选择。

不过BerkeleyDB表也有一些限制,让我们简单的了解一下:

  • 它的移动比较困难(在创建时,表路径硬编码在表文件中)
  • 不能压缩表索引,而且其表通常比MyISAM相应的表要大
  • 有点鸡肋的感觉,因为现在InnoDB格式很大程度上可以取代BerkeleyDB格式

InnoDB表类型:

InnoDB表(TYPE=INNODB),是一个完全兼容ACID(事务的原子性、一致性、独立性及持久性)的、高效率的表完全支持MySQL的事务处理并且不会btwagkyaakftntce。精细的(行级和表级)锁提高了MySQL事务处理的带走度,同时其也支持无锁定读操作(以前只在Oracle中包含)和多版本的特性。

异步输入/输出和一系列的读缓冲将提高数据检索速度,同时可以进行文件的优化和内存的管理。需要的基础上支持自动在内存上创建散列索引来提高性能,使用缓冲来提高可靠性和数据库操作的速度。InnoDB表的恨不能可以和MyISAM相媲美,甚至已经超过了MyISAM。

在不同的操作系统和体系结构上是完全可移植的。由于一直处于一致的状态(MySQL通过在启动时检查错误并修复错误来使它们更加健壮)。对外键、提交、回滚和前滚的操作的支持,使其成为MySQL中最完善的表格式

MERGE表类型:

  • MERGE表(TYPE=MERGE)是通过把多个MyISAM表组合到一个单独的表来创建的一种虚拟表。
  • 只有涉及到的表具有完全相同的表结构时才能对表进行组合。字段类型或者索引的任何不同都不能进行成功的结合。
  • MERGE表使用组成表的索引,并且不能维持它本身的索引,在某种情况下可以提高速度。
  • 允许SELECT,DELETE,UPDATE操作
  • 在需要把不同表的数据放到一起提高连接的性能或者在一系列表中进行搜索时,这种表很实用。
  • 处理大的MyISAM表时,我们可以通过压纹或者使用MySQL发布中包含的myisampack实用工具进行“打包”来减少这些表战胜的空间。myisampack创建比较小的只读表,而不会在使用智能压缩时导致任何大的性能开销。
修改 mysql 表类型/表引擎的 sql 语句:

alter table 表名 ENGINE= MyISAM;
alter table 表名 ENGINE= InnoDB;