InnoDB
InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这类型的文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。MySQL默认的存储引擎
支持事务(ACID)
支持行级锁
支持外键(只有它支持外键)
自动灾难恢复
支持AUTO_INCREMENT
更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求
MyIsam
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。
MyIsam 存储引擎独立于操作系统,也就是可以在windows上使用,也可以比较简单的将数据转移到linux操作系统上去。
MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:tb_demo.frm,存储表定义。
tb_demo.MYD,存储数据。
tb_demo.MYI,存储索引。
MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。
MyIsam索引
myisam引擎使用b+tree作为索引结构,叶节点的data域存放的是数据记录的地址转自https://blog.csdn.net/nuli888/article/details/52443011
InnoDB索引
虽然innodb也使用b+tree作为索引结构,但具体实现方式却与myisam截然不同
第一个重大区别是innodb的数据文件本身就是索引文件。从上文知道,myisam索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按b+tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引
第二个与myisam索引的不同是innodb的辅助索引data域存储相应记录主键的值而不是地址。换句话说,innodb的所有辅助索引都引用主键作为data域转自https://blog.csdn.net/nuli888/article/details/52443011
总结:
myisam
-主键索引/非主键索引
叶子节点上均带有行号,通过行号进行索引
innodb
-主键索引(聚簇索引) 叶子节点上带有数据
-非主键索引(第二索引) 叶子节点上带有主键id
myisam属于堆表,数据写入一直累积(concurrent_insert参数设置为2);此时写入性能比innodb好,但是无论是主键查询还是非主键查询,都不可避免的需要二次io(除非能索引内完成字段记录返回)
innodb属于聚簇索引组织表(主键索引即数据),由于必须保证索引有序,在写入时需要找到合适的位置进行插入,有时候还会导致二叉树调整所以写入性能比myisam要差;但是主键查找时只需要一次io即可返回数据,非主键索引查询时如果在索引内不能完成查询记录返回则需要第二次的io
参考资料
以上内容如有疏漏或错误敬请指出。