MYISAM和INNODB是MYSQL数据库的两个主要引擎,MYISAM是MYSQL5.5版本之前的默认的引擎,而INNODB是MYSQL 5.5版本默认引擎。
两个引擎的区别如下:
- 事务处理
INNODB支持事务处理功能,事务具有以下4个属性,通常简称为事务的ACID属性。
原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
一致性(Consisten):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性; 事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
隔离性(ISOLATION)数据库系统提供一定的隔离机制,保证事务在不受外部并发操作的影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性:事务完成之后,它对于数据的修改是永久性的,即使出现系统故障都保持。
MYISAM不支持事务处理。
- SELECT ,UPDATE,INSERT,DELETE操作
MYISAM:如果大量的SELECT,MYISAM是更好的选择
INNODB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面考虑,应该使用INNODB。
- 锁机制不同
INNODB 为行级锁,MYISAM为表级锁。
- 查询表的行数不同
MYISAM 记录表的总行数,所以当 COUNT(*)相对很快。
INNODB :不保存表的具体行数,也就是COUNT(*)时要对表进行一次全表扫描。
- MYISAM:每个MYISAM的表在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。
.frm文件存储表定义。
数据文件的扩展名为.MYD (MYData)。
索引文件的扩展名是.MYI (MYIndex)
INNODB :分为两种方式,一种为共享表空间方式,这种是所有表以及UNDO,索引都放在一个或多个表空间文件里,文件大小最大为64TB。第二种为每个表为一个单独的表空间。
6.MYISAM的表存储方式是HOT表,堆表。
INNODB表的存储方式是IOT表,(索引组织表)
7.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址。对于主键索引和辅助索引都是一样的。
InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对于主键索引,InnoDB 使用聚集索引,InnoDB的数据文件本身就是就是索引文件。而MyISAM,主键索引和数据文件是分离的。
InnoDB数据文件,要按主键聚集索引,这就要求InnoDB的表必须要有主键(MyISAM可以没有)。如果没有显式指定主键,InnoDB会自动选择一个可以唯一标识记录的字段作为主键,比如auto_increment的字段,如果不存在这样的列,InnoDB会自动生成一个隐含字段作为主键,这个隐含字段6个字节,是长整形。
对于InnoDB的辅助索引,叶子节点的data存放的是主键的值。这就意味着,使用辅助索引定位记录,需要使用两次索引:首先使用辅助索引找到主键的值,根据主键的值,使用主键索引找到记录。
InnoDB的辅助索引为什么要这样设计?
如果辅助索引data存放的行指针,当行移动或者数据页分裂时,需要更新data域行指针的值,这就增加维护成本。data存在主键的值,就没有这个问题。行移动和数据页分裂,主键索引会自动更新。data关联主键的值,不需要更新,相当于增加一个间接层。这个间接层对性能的影响也很小,因为通过主键定位记录是非常快的。
了解了innoDB的索引实现,有几个地方需要注意:
不要使用过长的字段作为主键,因为辅助索引都要使用主键索引定位记录,这个字段过长,使用内存更大,影响性能。
使用单调的字段作为主键,特别是insert的时候,如果是非单调的,B+Tree维护成本很高。
这就能很好解释,隔离级别 repeatable-read, 不使用索引锁住整个表,使用索引(主键索引或者辅助索引)只会锁住对应的行。
在查询执行计划中,有一个字段 type, eq_ref 表示使用主键索引,直接定位到记录。而ref 表示先使用辅助索引,找到主键的值,再使用主键索引定位到记录。
8.MYISAM不支持外键,INNODB支持外键
6mmy、my1, MyISAM :每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。