Category: MySQL

0

深入分析MySQL系列之总体架构介绍

在我们详细深入介绍MySQL的方方面面之前,让我们首先来看一下MySQL的总体架构,从总体上对MySQL有所了解,这样我们在后面的具体介绍部分的时候才能够知道这些部分属于哪个模块,大概有什么样的作用。 MySQL的逻辑架构 首先我们来看一下MySQL的逻辑架构,如下图所示。 我们可以看到大概可以分成三层: Connection/thread handing,这一层其实和MySQL没有什么大的关系,在一般的C/S架构中都会存在,一般用来处理相关的连接,认证,安全等等方面,我们不具体介绍。 Parser/Optimizer。这一层就是MySQL的大脑了,它主要工作就是解析查询语句,分析并进行优化,所有跨storage engines的函数都是在这里实现的,比如Stored Procedures,views等等。 Storage Engines。顾名思义,这一层的主要作用就是存储和查询数据。MySQL支持很多种不同的Storage Engine,我们在后面一一给大家介绍。 并行控制 在了解了MySQL的逻辑架构之后,我们来看一下MySQL对一些常见数据库的问题的处理方法。第一个问题当然就是我们常见的并行控制,简单说就是有读写同时发生的时候会如何处理。我们在之前的文章介绍过常见的处理方法,这里MySQL选用的是读写锁,也就是说读获取锁的时候,可以有多个读同时进行,但是写的锁是排外的,也就是说有写获取锁,那么任何别的读和写都没有办法获取相应的锁。 使用锁有一个重要的问题就是如何确定锁的粒度,说白了,你把锁加在越大的粒度上,并行的性能就会降低,因为拿不到锁的概率就会变大。假如你把锁的粒度搞到比较小,拿不到锁的概率就会变低,这样并行的性能就会变好,但是问题是锁消耗的资源其实是很大的看,粒度越小就意味着需要更多的锁,从而有更多的资源消耗。这就是我们需要考虑的trade off。 MySQL在这个方面提供了一些选择,根据不同的Storage engine可以实现不同的锁机制和锁粒度。不过通常来说有两种锁的机制比较常见: 表锁:顾名思义,即使lock整个表。每次写一个表的时候都去抓这个表锁,也就意味着其它任何读写都需要等待这个锁。 行锁:这个锁的粒度相比表锁来说就细了很多,它是应用到一行上面的。也就是说只有这行的数据被修改的时候,才会影响到需要修改这行数据的读和写。这样一来其实并行读写的性能就会变得比较好。 大多数MySQL使用的不是简单的行锁。他们使用的是行锁和一种称之为多版本同步控制(MVCC)的技术。这个技术我们在之前的《Snapshot的隔离和Repeatable的读》中有详细的介绍。 Transaction Transaction是一个通用的概念,这里我们不详细介绍,大家可以参考《Transactions的基本概念和介绍》这篇文章。 具体到MySQL,它有不同的storage engine支持Transaction,我们这里以最推荐的InnoDB来说明。 默认来说,单独的Insert,Update以及Delete操作是被隐式地转变成 一个Transaction并且立即commit的。也就是我们常说的AUTOCOMMIT。你可以使用SET AUTOCMMIT = 0/1来关掉或者打开这个功能。注意关掉之后,你就会一直在一个transaction里面,直到你commit或者rollback。 另外MySQL还可以自己设置隔离的级别,你可以简单使用下面这个命令来进行设置 如果你想了解具体关于transaction的隔离相关知识,可以参见这些文章: 《Transaction弱隔离之读提交的介绍和实现》 《Snapshot的隔离和Repeatable的读》...