MySQL提供了插件式的存储引擎架构。存储引擎是基于表的,而不是基于库的。
MySQL常用的存储引擎包括 MyISAM、InnoDB 和 Memory 。
一、MyISAM
- 特点:表级锁,不支持事务,不支持外键,读写速度快,支持全文索引。支持3种不同的存储格式,分别是:静态表,动态表,压缩表。MySQL5.5.8之前MyISAM是MySQL默认的存储引擎。
- 使用场景:要支持全文索引。
二、InnoDB
- 特点:行级锁(默认)、表级锁,支持事务,支持外键约束,支持自动增长列,InnoDB通过多版本并发控制(MVCC)来获得高并发性,MySQL5.6开始支持全文索引。MySQL5.5.8开始InnoDB成为MySQL默认的存储引擎。
- 使用场景:
- 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
- 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
- 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
- 外键约束。MySQL支持外键的存储引擎只有InnoDB。
- 支持自动增加列AUTO_INCREMENT属性。
三、Memory
- 特点:(之前被称为Heap存储引擎),表级锁,将表数据存储在内存当中,表结构以文件存储于磁盘。访问速度非常快,数据在MySQL重启或者崩溃时会丢失,要求存储数据长度不可变,所以无法使用BLOB和TEXT。默认使用Hash索引,还可以选择使用B-Tree索引。
- 使用场景:
- 临时的数据:目标数据只是临时需要,在其生命周期中必须立即可用。
- 相对无关的数据:存储在MEMORY表中的数据如果突然丢失,不会对应用服务产生实质的负面影响,而且不会对数据完整性有长期影响。
四、相关命令
- 查询MySQL系统中支持的存储引擎
show engines;
- 查看MySQL当前默认存储引擎
show variables like '%storage_engine%';
- 指定存储引擎为InnoDB
CREATE TABLE 表名(
......
) ENGINE = INNODB;
修改表的存储引擎为InnoDB
ALERT TABLE 表名 ENGINE = INNODB;
//使用ALERT TABLE修改表的存储引擎可能导致数据库中的数据丢失,所以在修改前,需要备份数据。
五、三种锁:
- 表级锁:直接锁定整张表,表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
- 行级锁:单独的一行记录加锁,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。共享锁(S)和排他锁(X)。
- 页面锁:表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
三者区别:
- 表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
- 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
如有错误,欢迎留言指正 * _ *