MySQL数据库及其分支版本主要的存储引擎有InnoDB
、MyISAM
、 Memory
等。简单地理解,存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色,使用的是一个可插拔存储引擎架构,能够在运行的时候动态加载或者卸载这些存储引擎。不同的存储引擎决定了MySQL
数据库中的表可以用不同的方式来存储。我们可以根据数据的特点来选择不同的存储引擎。在MySQL中的存储引擎有很多种,可以通过SHOW ENGINES语句
来查看:
在Support
列中,YES
表示当前版本支持这个存储引擎;DEFAULT
表示该引擎是默认的引擎,即InnoDB
。
下面重点关注InnoDB
、MyISAM
、MEMORY
这3种。
① InnoDB
是事务型数据库的首选引擎,支持事务ACID
,简单地说就是支持事务完整性、一致性。
② InnoDB
支持行级锁。行级锁可以在最大程度上支持并发,以及类似Oracle
的一致性读、多用户并发。
③ InnoDB
是为处理巨大数据量的最大性能设计,InnoDB
存储引擎完全与MySQL
服务器整合,InnoDB
存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
④ InnoDB
支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显式在表定义时指定主键,InnoDB
会为每一行生成一个6字节的ROWID
,并以此作为主键。
⑤ InnoDB
支持崩溃数据自修复。InnoDB
存储引擎中就是依靠redolog
来保证的。当数据库异常崩溃后,数据库重新启动时会根据redolog
进行数据恢复,保证数据库恢复到崩溃前的状态。
① MyISAM
存储引擎不支持事务,所以对事务有要求的业务场景不能使用。
②其锁定机制是表级索引,虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。
③不仅会在写入的时候阻塞读取,MyISAM
还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
④只会缓存索引:MyISAM
可以通过key_buffer
缓存,以大大提高访问性能减少磁盘I/O,但是这个缓冲区只会缓存索引,而不会缓存数据。
⑤适用于不需要事务支持(不支持)、并发相对较低(锁定机制问题)、数据修改相对较少(阻塞问题)、以读为主这类场景。
MEMORY
存储引擎是MySQL中的一类特殊存储引擎,使用存储在内存中的内容来创建表,而且所有数据也放在内存中。
①每个基于MEMORY
存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm
类型。该文件中只存储表的结构,数据文件则存储在内存中。
② MEMORY
默认使用哈希索引,速度比使用B型树索引快。如果想用B型树索引,可以在创建索引时指定。
③ MEMORY
存储引擎是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,那么所有数据都会消失。
在实际工作中,选择一个合适的存储引擎是比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那么选择InnoDB
有很大的优势。如果表主要是用于插入记录和读出记录,那么选择MyISAM
能实现处理高效率。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMORY
,它对表的大小有要求,不能建立太大的表.
MySQL逻辑架构整体分为3层:
第一层是客户端层,所包含的并不是MySQL独有的技术,它们都是服务于C/S程序或者是这些程序所需要的,诸如连接处理、身份验证、安全性等功能均在这一层处理。
第二层是SQL层(SQL Layer),因为这是MySQL的核心部分,通常也叫作核心服务层。在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL解析、执行计划优化、Query cache的处理以及所有内置的函数(如日前时间、加密等函数)、存储过程、视图、触发器等。
第三层是存储引擎层(Storage Engine Layer),是底层数据存取操作实现的部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据,类似Linux的众多文件系统。每个存储引擎都有自己的优势和劣势,通过存储引擎API来与它们交互,这些API接口隐藏了各个存储引擎不同的地方。对于查询层尽可能透明。
虽然看起来MySQL架构好像比较简单,但是实际上每一层中都含有各自的很多小模块,尤其是第二层SQL Layer,结构蛮复杂的,如图:
我们简单地做如下剖析:
(1)Connectors
:指的是不同语言中与SQL的交互。
(2)Management Services & Utilities
:管理服务和工具组件,从备份和恢复的安全性、复制、集群、管理、配置、迁移和元数据等方面管理数据库。
(3)Connection Pool
:连接池,是为解决资源的频繁分配﹑释放所造成的问题而为数据库连接建立的一个“缓冲池”。原理是预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。它的作用是进行身份验证、线程重用、连接限制、管理用户的连接、线程处理等需要缓存的需求。
(4)SQL Interface
(SQL接口):接受用户的SQL命令,并且返回用户需要查询的结果。比如select from
就是调用SQL Interface。
(5)Parser
:解析器,验证和解析SQL命令。SQL命令传递到解析器的时候会被解析器验证和解析,并生成一棵对应的解析树。在这个过程中,解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等。
(6)Optimizer
:查询优化器。SQL语句在查询执行之前,会使用查询优化器对查询进行优化,得出一个最优的策略。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到其中最好的执行计划。用一个例子就可以理解,比如“select uid,name from user where gender=1
”。这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行gender过滤;这个select
查询先根据uid
和name
进行属性投影,而不是将属性全部取出来以后再进行过滤;将这两个查询条件联接起来生成最终查询结果。
(7)Cache和Buffer
:主要功能是将客户端提交给MySQL的select
类query
请求的返回结果集缓存到内存中,与该query
的一个hash
值做一个对应。该query
所取数据的基表发生任何数据的变化之后,MySQL会自动使该query
的Cache
失效。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key缓存、权限缓存等。
(8)Pluggable Storage Engines
:可插拔存储引擎。MySQL区别于其他数据库的最重要的特点就是其插件式的存储引擎接口模块,这个可以说是MySQL数据库中最有特色的一个特点了。目前,各种数据库产品中只有MySQL可以实现底层数据存储引擎的插件式管理。这个模块实际上只是一个抽象类,根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制,这种访问机制就称为存储引擎。正是因为它成功地将各种数据处理高度抽象化才成就了今天MySQL可插拔存储引擎的特色。每个存储引擎开发者都可以按照自己的意愿来进行开发,存储引擎是基于表的。MyISAM存储引擎的查询速度快,有较好的索引优化和数据压缩技术,但是它不支持事务。InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。Memory使用存储在内存中的数据来创建表,而且所有的数据也都存储在内存中。
(9)File System
:数据存储在运行于裸设备的文件系统之上,支持的文件类型有EXT3、EXT4、NTFS、NFS。
(10)File&Logs
:数据文件以及redo、undo等各种日志文件。