MySQL体系结构和存储引擎

一、定义数据库和实例

数据库和实例在数据库领域很容易被混淆。作为常见的数据库术语,这两个词定义如下:

数据库

物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。

那么什么是NDB引擎(这里稍微普及一下)?
NDB也称为NDB CLUSTER, 是另一种存储引擎,但是它主要存储数据在内存中,并且独立于MySQL Server实例。它是MySQL Cluster使用的存储引擎。 NDB代表“网络数据库”。

参考资料:
InnoDB和NDB,MySQL群集和InnoDB群集之间有什么区别?

实例

MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。

两个词的可以互换使用,但两者的概念完全不同。
因为在MySQL数据库中,实例与数据库的关系通常是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。但是,在集群情况下可能存在一个数据库被多个数据实例使用的情况。

关于MySQL集群可以参考:
Mysql集群搭建(多实例、主从)
如何在Ubuntu 16.04上安装MySQL集群

MySQL体系结构

数据库和数据库实例容易混淆?

从概念上来说,
数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;
数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。

MySQL数据库体系结构,如下图所示:

由图可知,MySQL由以下几部分组成:
连接池组件
管理服务和工具组件
SQL接口组件
查询分析器组件
优化器组件
缓存组件
插件式存储组件
物理文件

MySQL区别于其他数据库的最重要的一个特点是骑插件式的表存储引擎。

存储引擎是基于表的,而不是数据库。

二、MySQL存储引擎

存储引擎是MySQL区别于其他数据库的一个最重要特性。

存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。

1.InnoDB存储

InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理的应用。

特点:行锁设置、支持外键、并支持类似于Oracle的非锁定读(默认读取操作不会产生锁)。

从MySQL数据库5.5.8版本开始InnoDB是默认的存储引擎。

每个InnoDB存储引擎的表单独放到一个独立的ibd文件中。

InnoDB存储引擎支持用裸设备用来建立表空间。

InnoDB通过使用多版本并发控制来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为RE-PEATABLE级别。同时使用了next-key locking的策略避免幻读现象的产生。

InnoDB存储引擎还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。

对于表中数据的存储,InnoDB存储引擎采用了聚集的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

InnoDB存储引擎是MySQL数据库最为常用的一种引擎。

SpringBoot+MyBatis-Plus实现多数据源

一、介绍

dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

1.dynamic-datasource-spring-boot-starter开源地址

GitHub开源地址(具体详情可参考官方文档):
https://github.com/baomidou/dynamic-datasource-spring-boot-starter

2.说明和应用场景

可用于主从分离、读写分离、分布式事务等。

二、详细整合步骤

1.导入Maven依赖

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>

2.application.yml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
spring:
datasource:
dynamic:
primary: db1 #设置默认的数据源,默认值为master
datasource:
db1: #数据源db1
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wordpress_master?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
db2: #数据源db2
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wordpress_slave?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
#Oracle需要打开注释
#validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /druid/*
#login-username: admin
#login-password: admin
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true

3.完成1、2步后,启动应用

如果控制台不报错且出现如下图所示,就表示成功整合:

4.注意事项

启动主类需要排除Druid相关依赖,否则会出现如下错误:

1
2
3
4
5
6
7
8
9
***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

解决办法,加上如下代码即可:

1
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

Iaas、Paas、Saas对比分析

Iaas、Paas、Saas对比分析

从Iaas、Paas到Saas,客户所要管理负责由多到少,成本也越来越低。下面所列举的,足以看出。
以我所待的公司,无论是外包还是创业公司也好。基本上采用的都是Saas这种模式,Sass对于客户而言省事省时省钱(从Applications到Compute无需管理)。对于供应商,也就是我们而言,由于从应用开发到部署,再到维护都由我们负责,从一定程度上降低一些问题排错的时间成本(过去写一套系统部署在不同的操作系统,不同的操作系统的版本环境存在差异,可能会遇到在这个系统正常运行,在那个系统出现一些问题,不排除是因为代码的原因,但有的时候也与环境有极大的关系)。