MyISAM存储引擎?
它管理的表具有以下特征:
使用三个文件表示每个表:
格式文件 — 存储表结构的定义(mytable.frm)
数据文件 — 存储表行的内容(mytable.MYD)
索引文件 — 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率的一种机制。
可被转换为压缩、只读表来节省空间

提示一下:
		对于一张表来说,只要是主键,
		或者加有unique约束的字段上会自动创建索引。

	MyISAM存储引擎特点:
		可被转换为压缩、只读表来节省空间
		这是这种存储引擎的优势!!!!
	
	MyISAM不支持事务机制,安全性低。

InnoDB存储引擎?
这是mysql默认的存储引擎,同时也是一个重量级的存储引擎。
InnoDB支持事务,支持数据库崩溃后自动恢复机制。
InnoDB存储引擎最主要的特点是:非常安全。

它管理的表具有下列主要特征:
	– 每个 InnoDB 表在数据库目录中以.frm 格式文件表示
	– InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引。)

	– 提供一组用来记录事务性活动的日志文件
	– 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理
	– 提供全 ACID 兼容
	– 在 MySQL 服务器崩溃后提供自动恢复
	– 多版本(MVCC)和行级锁定
	– 支持外键及引用的完整性,包括级联删除和更新

InnoDB最大的特点就是支持事务:
	以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,
	不能很好的节省存储空间。

MEMORY存储引擎?
使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定,
这两个特点使得 MEMORY 存储引擎非常快。

MEMORY 存储引擎管理的表具有下列特征:
	– 在数据库目录内,每个表均以.frm 格式的文件表示。
	– 表数据及索引被存储在内存中。(目的就是快,查询快!)
	– 表级锁机制。
	– 不能包含 TEXT 或 BLOB 字段。

MEMORY 存储引擎以前被称为HEAP 引擎。

MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互。
MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。

什么是事务?
一个事务其实就是一个完整的业务逻辑。
是一个最小的工作单元。不可再分。
事务包括4个特性?

事务特性:(ACID) 
1、原子性(Atomicity):即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务和事务之间的隔离级别有哪些呢?4个级别

读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》
		什么是读未提交?
			事务A可以读取到事务B未提交的数据。
		这种隔离级别存在的问题就是:
			脏读现象!(Dirty Read)
			我们称读到了脏数据。
		这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!

	读已提交:read committed《提交之后才能读到》
		什么是读已提交?
			事务A只能读取到事务B提交之后的数据。
		这种隔离级别解决了什么问题?
			解决了脏读的现象。
		这种隔离级别存在什么问题?
			不可重复读取数据。
			什么是不可重复读取数据呢?
				在事务开启之后,第一次读到的数据是3条,当前事务还没有
				结束,可能第二次再读取的时候,读到的数据是4条,3不等于4
				称为不可重复读取。

		这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。
		oracle数据库默认的隔离级别是:read committed

	可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
		什么是可重复读取?
			事务A开启之后,不管是多久,每一次在事务A中读取到的数据
			都是一致的。即使事务B将数据已经修改,并且提交了,事务A
			读取到的数据还是没有发生改变,这就是可重复读。
		可重复读解决了什么问题?
			解决了不可重复读取数据。
		可重复读存在的问题是什么?
			可以会出现幻影读。
			每一次读取到的数据都是幻象。不够真实!
		
		早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!
		读到的是假象。不够绝对的真实。

		mysql中默认的事务隔离级别就是这个!!!!!!!!!!!

	序列化/串行化:serializable(最高的隔离级别)
		这是最高隔离级别,效率最低。解决了所有的问题。
		这种隔离级别表示事务排队,不能并发!
		synchronized,线程同步(事务同步)
		每一次读取到的数据都是最真实的,并且效率是最低的。

mysql事务隔离级别,说下你对事务的隔离性的理解?
为了达到上述事务特性,数据库定义了几种不同的事务隔离级别:
READ_UNCOMMITTED(未授权读取): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、
幻读或不可重复读
READ_COMMITTED(授权读取): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读
仍有可能发生
REPEATABLE_READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修
改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(串行): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之
间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的
性能。通常情况下也不会用到该级别。
这里需要注意的是:Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED
隔离级别.
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改
的旧版本信息来支持并发一致性读和回滚等特性。

Mysql的存储引擎,myisam和innodb的区别
区别:

  1. InnoDB支持事务,MyISAM不支持
    对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在
    begin和commit之间,组成一个事务;
  2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
    但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太
    大,其他索引也都会很大。
    而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了
    整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;