查看当前支持的存储引擎:
show engines
指定数据表的存储引擎
create table mytb {
id int primary key,
name varchar(100)
} type=InnoDB // 创建时指定
alter table mytb type=MyISAM // 创建后修改
MySQL 支持的存储引擎
Engine | Support | Comment | Transactions | XA | Savepoints |
---|---|---|---|---|---|
MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
CSV | YES | CSV storage engine | NO | NO | NO |
MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
MyISAM | YES | MyISAM storage engine | NO | NO | NO |
FEDERATED | YES | FederatedX pluggable storage engine | YES | NO | YES |
ARCHIVE | YES | Archive storage engine | NO | NO | NO |
InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO |
InnoDB VS MyISAM
比较项目 | InnoDB(MySQL 默认) | MyISAM |
---|---|---|
事务 | 支持<br /> *START TRANSACTION;<br /> INSERT...<br /> UPDATE...<br /> COMMIT; * | 不支持,速度更快 |
锁机制 | 行锁<br > 支持大量 insert/update 效果更好 | 表锁<br > 支持大量 select 效果更好 |
查询行数 | 不保存行数 | 保存行数<br /> select count(*) 直接返回 |
物理结构 | 每个表对应一个文件 | 每个表对应三个文件 |
自增长ID | 把当前最大ID放在内存中 | 把当前最大ID放在文件中 |
InnoDB 是高并发互联网场景最为推荐的存储引擎。具体参见:MySQL InnoDB 并发控制,事务的实现 学习笔记
几个补充,参见:InnoDB,5项最佳实践,知其所以然?
关于
count(*)
:MyISAM 会直接存储总行数,InnoDB 则不会,需要按行扫描。注意:只有查询全表的总行数,MyISAM 才会直接返回结果,当加了where
条件后,两种存储引擎的处理方式类似。关于全文索引:MyISAM 支持全文索引,InnoDB 5.6 之前不支持全文索引。
关于外键:MyISAM 不支持外键,InnoDB 支持外键。注意:不管哪种存储引擎,在数据量大并发量大的情况下,都不应该使用外键,而建议由应用程序保证完整性。
-
关于行锁与表锁:MyISAM 只支持表锁,InnoDB 可以支持行锁。
- MyISAM:执行读写 SQL 语句时,会对表加锁,所以数据量大,并发量高时,性能会急剧下降。
- InnoDB:细粒度行锁,在数据量大,并发量高时,性能比较优异。
- InnoDB 的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。
例如:t_user(uid PK, uname, age, sex) innodb;
update t_user set age=10 where uid=1;
命中索引,行锁。
update t_user set age=10 where uid != 1;
未命中索引,表锁。
update t_user set age=10 where name='shenjian';
无索引,表锁。