一、什么是存储引擎以及Mysql支持的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)
SHOW ENGINES来看一下Mysql支持哪些存储引擎
在Mysql5.5版本之后,使用InnoDB作为默认引擎,它支持事务,行级锁和外键。Mysql中的存储引擎是针对表的,可以对不同的表使用不同的存储引擎。
二、锁
在分析存储引擎之前,先看一下锁
锁的分类
①从对数据操作的类型(读\写)分为:
- 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
- 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
②从对数据操作的粒度分为:
表锁 :偏向MyISAM存储引擎,开销小,加锁块;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行锁 : 偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用; 而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。
三、InnoDB
InnoDB是一种事物存储引擎,完全支持事物的ACID特性,它是使用日志来保证事物的,也就是Redo log(重做日志) 和 Undo log(回滚日志)。
Redo log主要存储已经提交的事务,而Undo log主要存储还未提交的事务。
InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描
支持行级锁,行级别锁可以最大程度支持并发,行级锁是由存储引擎层来实现的
引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
四、MyIsAM
如果应用是以查询操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MyIsAM存储引擎mysql会创建3个文件:
- FRM文件是所有存储引擎都会创建的,用来记录表结构。
- MYD是来记录存储的数据。
- MYI用来记录索引数据。
MyISAM支持对任意意外关闭所损坏的表的检查和修复,这里的修复并不是通过事物来修复的,因为MyISAM不支持事物,有可能造成数据的丢失
check table tablename 检查表
repair table tablename 修复表
五、Memory
将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm
支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;
支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;
由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;
查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
默认使用hash索引。如果一个内部表很大,会转化为磁盘表。
六、总结