MySql存储引擎
常用引擎的比较
InnoDB(默认) | MyISAM | Memory | |
---|---|---|---|
事务 | 支持(默认事务隔离级别:可重复读) | 不支持 | 不支持 |
存储限制 | 64TB | 256TB | 物理内存 |
物理外键 | 支持 | 不支持 | 不支持 |
存储方式 | 表结构放在.frm文件,数据和索引放在.idb文件中 | 表结构放在.frm文件,数据放在myd文件,索引放在.myi文件 | 每一个表和.frm文件关联,不支持blob和text数据类型,只存储在内存(mysql重启后数据消失) |
锁粒度 | 默认行锁,也支持表锁 | 仅支持表锁 | 仅支持表锁 |
补充
- MySQL表级锁有两种模式: 表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
对MyISAM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。
InnoDB行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁! - auto_increment属性的列要求是索引或者复合索引的一部分。复合索引时,innodb存储引擎要求该列必须是复合索引的第一列,而myisam存储引擎则可以是其他列。
- InnoDB 中不保存表的具体行数,也就是说,执行select count() from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时,两种表的操作是一样的。
- MyISAM适合:
(1)做很多count(*)计算;
(2)写入不频繁,查询非常频繁,MyISAM是更好的选择
(3)没有事务。 - InnoDB适合:
(1)可靠性要求比较高,或者要求事务;
(2)读写均衡的场景
(3)没有事务。 - MRG_MyISAM是MyISAM的一个变种,将几个相同的MyISAM表合并为一个虚表。常用于日志和数据仓库。
- ARCHIVE,拥有很好的压缩机制,仅支持插入和查询功能,经常被用来做数据仓库使用。