MySQL 存储引擎学习笔记

查看当前支持的存储引擎:

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
事务 支持
*START TRANSACTION;
INSERT...
UPDATE...
COMMIT; *
不支持,速度更快
锁机制 行锁
支持大量 insert/update 效果更好
表锁
支持大量 select 效果更好
查询行数 不保存行数 保存行数
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'; 无索引,表锁。

你可能感兴趣的:(MySQL 存储引擎学习笔记)