Mysql是当下互联网盛行的一个可移植的结构性数据库,几乎在各个系统平台上都能见到它的身影,Linux系列,Mac,Windows等;但它是怎么保证在各个各个平台物理体系结构的一致性的呢?所以我们有必要了解Mysql的工作机制,今天我们就先从它的体系结构说起。
首先我们先理解数据库领域的两个术语,不知道你当前又是怎么理解的;
- 实例:instance,它是由数据库的后台进程(或线程)及一个共享内存组成。共享内存可以被后台进程所共享,需要铭记的是:数据库实例才是真正用来操作数据库文件的。
- 数据库:database,其实它就是物理操作系统文件或其他形式类型的文件的一个集合。在mysql中可以是以myi、frm、myd等结尾的文件
一般情况下,实例和数据库是一一对应的,也就是一个数据库对应一个实例,一个实例对应一个数据库;但mysql被设计为一个单进程多线程的数据库,在集群情况下有可能一个数据对应多个实例;其实从系统表现层面上看mysql的数据库实例就是一个后台进程。
有时候有很多人会对msql有很多疑问:
- mysql支持全文索引吗?
- mysql数据量大于一千万时,性能会不会急剧下降?
其实除了这两个问题还有很多类似的问题?在回答这些问题前我觉得我们首先应该了解它的体系结构是什么样的?这样我们这些问题就不攻自破了?
其实说白了数据就是由一个一个文件组成的;我们想要对数据库进行一系列的操作都是通过数据库实例来完成的,数据库实例就是一个应用程序,是我们(用户应用程序)和数据库之间的一个桥梁;我们看看mysql数据库的体系结构图:
![d48b7268e1c89551c18460ced4981c7c.png](https://img-blog.csdnimg.cn/img_convert/d48b7268e1c89551c18460ced4981c7c.png)
你看下它的组成, 从上到下从左到右:
- 连接池组件;
- 管理服务和工具组件
- Sql接口组件
- 查询解析组件
- 优化组件
- 缓存组件
- 插件式的存储引擎
- 物理文件
其实Mysql数据库与其他数据的重要区别是它的存储引擎是插件化的,存储引擎是底层物理结构的实现,比如我们经常使用的InnoDB,每个引擎都有自己的特点,有能力的可以根据自己的意愿进行开发,实现自己特有的存储引擎。
下面我们看下几个常见存储引擎并简单了解它们的特性,通过比较它们之间的区别;我们使用的时候让它们更好的适用于我们业务场景:
- InnoDB;最大特点支持事物,主要面向在线事物处理(OLTP)方面的应用。行级锁设计、支持外键,使用多版本并发控制(MVCC)获得高并发性;实现了sql标准的四种隔离级别;数据存储采用聚集的方式,每张表的存储都按照主键顺序存放,如果没有指定主键会默认生成一个6字节的rowId作为主键。
- MyISAM;特点不支持事物、表级锁和全文索引,对于一些OLAP(在线分析处理)操作速度快。引擎表由MYD和MYI组成,分别为数据和索引文件;其余特性感兴趣的可以单独查询。
- NDB;它是一个集群存储引擎,其结构是 share nothing的集群架构,所以能提供更高级别的高可用性;数据是全部放在内存中的(5.1后非索引数据放在磁盘),因此按主键查询速度极快,但链接操作是在数据库层完成,所以复杂的链接操作会有很大的网络开销。
- Memory;将表中的数据全部放在内存;如果数据库重启或崩溃会消失,因此可以存放一些临时数据的临时表;默认使用哈希索引。
- Archive;只支持插入和压缩,支持行级锁,设计用来提供高速的插入和压缩功能;适合存储归档信息,如日志信息;压缩比例在1:10。
- Federated;特点是它并不存放数据,只是指向远程Mysql数据库服务器上的表。
- Maria;设计目标主要用来替代MyISAM;特点:缓存数据、行级锁,提供MVCC功能;支持事物和非事物的选择,以及更好BLOB字符类型处理性能。
除了上边7个存储引擎外还有Merge,CSV,Sphinx和Infobright,感兴趣额可自己进行查询;
那Mysql支持全文索引吗?支持,MyISAM和Sphinx支持全文索引;
当表的数据量超过1000W性能会急剧下降吗?Mysql是数据库,不是文件,随着数据行数的增加,性能肯定会下降,但下降不是线性的。
我们看下不同mysql存储引擎一些特性的比较,有利于我们更加了解,更好的使用它们:
![51b47d7c1064492178fbfb1800b94c6a.png](https://img-blog.csdnimg.cn/img_convert/51b47d7c1064492178fbfb1800b94c6a.png)
我们可以通过 SHOW ENGINES命令查看当前使用的Mysql支持的存储引擎;
所以我们通过了解Mysql的体系结构,了解到它与其他数据库的最大区别在于插件化的存储引擎,这样我们在使用它过程成做到心中有数。
欢迎交流学习,共同进步!