MySQL数据引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在mysql中被称作存储引擎(也称作表类型),MySql默认配置了许多不同的存储引擎,可以预先设置或者在MySql服务器中启用,键入show engines查看数据库支持的引擎。
InnoDB:Innodb引擎提供了对数据库ACID事务的支持,所谓事务处理,就是原子性操作。打个比方,支持事务处理的Innodb表。你执行一个insert语句,插入后就要执行一个update语句来修改其他相关的数据。假设一种特殊情况突然发生,insert成功了但是update没有成功,这时候数据会混乱。如果使用了事务处理,insert和update都放入到事务中去执行,这个时候,只有当insert和update两条语句都执行生成的时候才会将数据更新、写入到中,如果其中任何一条语句失败,那么就会回滚为初始状态,不执行写入。这样就保证了insert和update肯定是一同执行的。除此之外它还提供了行级锁和外键的约束。锁行,就是说,你执行update语句是,只会将这一条记录进行锁定,只有针对这条记录的其他写入、更新操作会被阻塞并等待这条update语句执行完毕后再执行,针对其他记录的写入操作不会有影响。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用它会提升效率的。
MyISAM:不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的。可以将MyIASM作为数据库引擎的首先 。对于MyIASM引擎来说,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。而Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。
Memory:Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。
参考如下Memory引擎的使用场景及特点:
1能像会话(Session)或缓存(Caching)一样方便操作和管理。
2充分发挥内存引擎的特点:高速度,低延迟。
3只读或读为主的访问模式(不适合频繁写)。
4但是内存表的性能受制于单线程的执行效率和写操作时的表锁开销,这就限制了内存表高负载时的扩展性,特别是混合写操作的并发处理。此外,内存表中的数 据在服务器重启后会丢失。
BlACKHOLE:这个存储引擎似乎看起来没什么用处,因为它不允许任何数据的存储或者查询。因此BLACKHOLE 通常被用来测试数据库的结构、索引和擦查询。你仍然可以使用 INSERTS 命令来插入,只不过所有的数据都是void
CSV:从MySQL4.1.4开始添加的存储引擎,以逗号分隔的字符串存储数据。因此这个存储引擎不适合大规模的数据存储或者需要索引的数据表等场景。这个存储引擎适合将数据转成spreadsheet 文件
ARCHIVE:从MySQL 4.1.3 开始添加的存储引擎,它经常被用来存储大规模数据(无需索引)。这个存储引擎只支持 INSERT 和 SELECT操作,而且所有的信息都是被压缩过的。这些特性让ARCHIVE很适合用来存储日志、交易记录、账户等。不过需要注意的是,在读取数据的时候,整个表都需要在数据返回之前解压并读取。因此这个存储引擎最适合使用频率较低的场景。
FEDERATED:Federated存储引擎是访问MySQL服务器的一个代理,尽管该引擎看起来提供了一个很好的跨服务器的灵活性,但是经常带来问题,默认是禁用的。