一、数据库和实例
1.定义
数据库
实例
数据库实例是程序,是用户和OS之间的一层数据管理软件,用于操作数据库文件。
一言以蔽之:数据库是一个个文件组成的,要对文件进行CRUD不能直接通过修改文件,要通过实例来操作数据库。
mysql是 单进程多线程的,mysql数据库实例在操作系统上的表现就是一个进程。
在mysql数据库中,实例与数据库的关系一般是一一对应,一个数据库对应一个实例,一个实例对应一个数据库,集群情况下,可能一个数据库被多个数据实例使用。
2.查看mysql进程
ps命令查看mysql数据库启动后的进程:
[root@iZ2zecwzxu1ljquv21q0y5Z /]# ps -ef|grep mysqld
mysql 11381 1 0 Jan30 ? 03:57:25 /usr/sbin/mysqld
root 13102 13068 0 10:00 pts/0 00:00:00 grep --color=auto mysqld
11381就是mysql实例进程。
3.mysql配置文件&数据文件
启动实例时,mysql会读取配置文件,根据配置文件参数启动数据库实例。
下面命令查看mysql启动实例时,,从那些位置找配置文件。
[root@iZ2zecwzxu1ljquv21q0y5Z sbin]# mysql --help |grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
mysql按照 /etc/my.cnf —-> /etc/mysql/my.cnf —-> /usr/etc/my.cnf ——> ~/.my.cnf顺序读取配置文件,在Linux中配置文件一般在 /etc/my.cnf下 :
my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
里面的 datadir=/var/lib/mysql 指定了数据库的路径,看一下都有啥:
datadir
[root@iZ2zecwzxu1ljquv21q0y5Z mysql]# ls -lh /var/lib/mysql
total 186M
-rw-r----- 1 mysql mysql 56 Jan 30 21:28 auto.cnf
-rw-r----- 1 mysql mysql 1.2M Jun 2 14:38 binlog.000001
-rw-r----- 1 mysql mysql 16 Jan 30 21:28 binlog.index
-rw------- 1 mysql mysql 1.7K Jan 30 21:28 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Jan 30 21:28 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Jan 30 21:28 client-cert.pem
-rw------- 1 mysql mysql 1.7K Jan 30 21:28 client-key.pem
drwxr-x--- 2 mysql mysql 4.0K Jun 2 14:36 hy
-rw-r----- 1 mysql mysql 192K Jun 2 14:40 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql 8.2M Feb 11 23:21 #ib_16384_1.dblwr
-rw-r----- 1 mysql mysql 5.8K Jan 30 21:28 ib_buffer_pool
-rw-r----- 1 mysql mysql 12M Jun 2 14:38 ibdata1
-rw-r----- 1 mysql mysql 48M Jun 2 14:40 ib_logfile0
-rw-r----- 1 mysql mysql 48M Jan 30 21:28 ib_logfile1
-rw-r----- 1 mysql mysql 12M Jan 30 21:28 ibtmp1
drwxr-x--- 2 mysql mysql 4.0K Jan 30 21:28 #innodb_temp
drwxr-x--- 2 mysql mysql 4.0K May 5 21:17 mysql
-rw-r----- 1 mysql mysql 24M Jun 2 14:38 mysql.ibd
srwxrwxrwx 1 mysql mysql 0 Jan 30 21:28 mysql.sock
-rw------- 1 mysql mysql 6 Jan 30 21:28 mysql.sock.lock
drwxr-x--- 2 mysql mysql 4.0K Jan 30 21:28 performance_schema
-rw------- 1 mysql mysql 1.7K Jan 30 21:28 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Jan 30 21:28 public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Jan 30 21:28 server-cert.pem
-rw------- 1 mysql mysql 1.7K Jan 30 21:28 server-key.pem
drwxr-x--- 2 mysql mysql 4.0K Jan 30 21:28 sys
-rw-r----- 1 mysql mysql 16M Jun 2 14:40 undo_001
-rw-r----- 1 mysql mysql 16M Jun 2 14:40 undo_002
二、MySql体系结构
1.体系结构-详细
MySQL是由SQL接口,解析器,优化器,缓存,存储引擎组成的(SQL Interface、 Parser、 Optimizer、Caches&Buffers、Pluggable Storage Engines)
- Connector
不同语言中与SQL的交互
- 连接池组件
管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要
- 管理服务和工具组件
系统管理和控制工具,例如备份恢复、Mysql复制、集群等
- SQL接口组件
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
- 查询分析器组件
解析器, SQL命令传递到解析器的时候会被解析器验证和解析。主要功能:a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
查询优化器组件
SQL语句在查询之前会使用查询优化器对查询进行优化
缓冲(Cache)组件
查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存, key缓存,权限缓存等
- 插件式存储引擎
存储引擎。存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
- 物理文件
MySQL相关底层文件
2.体系结构-简化
连接器
查询缓存
分析器

优化器
3.工作流程
1.MySQL客户端向服务器发送用户连接请求,该请求被发送到连接管理器,连接管理器是一个侦听器用于监听来自客户端的连接,用户请求接收后,一个用户请求需要一个线程来相应,线程管理器负责给用户创建生成新的线程。用户连接进来后需要对用户的权限进行验证,验证由用户模块负责管理
2.连接上以后,可以发送sql语句,不同的语句分配给不同的解析器,这由命令分发模块完成,若命令在分发前是一个查询语句,而缓存中有内容(mysql8已经把缓存去掉了,因为数据经常变),就可以直接返回结果给用户,因此也有可能与缓存模块进行交互;当用户发送一个命令请求资源后,会被记录在日志中,命令分发模块也可以和日志模块交互
3.如果缓存中没有需要的结果,就把命令分发出去交给解析器,由解析器判断命令属于哪种语句;如果是select语句就由优化器优化,若是update,insert,delete语句就交给表定义模块;无论哪个模块,用户最终要完成操作必须检查是否具有权限,所以这些命令最终要交给访问控制模块,用于检验客户端用户的操作是否具有足够的操作权限,来执行请求操作如果访问模块检查后发现没有任何问题,会把这些命令语句交给另一个组件表管理器,由表管理器完整真正意义上的操作,表管理器负责创建、读取或修改表定义文件的。表管理器交给存储引擎(存储引擎的接口),存储引擎交给最核心的—>MYISAM或INnoDB
三、MySql存储引擎
存储引擎是基于表的,不是基于数据库的。
CREATE TABLE `t_user` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.InnoDB存储引擎
InnoDB支持事务,支持行锁,支持外键,支持“非锁定读”即默认读操作不产生锁。
可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL的4种隔离级别,默认为REPEATABLE。
使用next-key-locking 来避免幻读。
InnoDB提供插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引、预读(read ahead)高可用高性能的功能。
show engines 查看当前数据库支持的存储引擎
2.连接MySql
连接mysql操作是一个连接进程和mysql数据库实例进行通信,本质上是进程间的通信。
常用的进程通信方式有:管道、命名管道、命名名字、TCP/IP 、UNIX域套接字,mysql提供的连接方式本质上也是这些。
TCP/IP
在TCP/IP连接上建立一个基于网络的连接请求,一般Client和Mysql Server不在一个机器上,两台机器通过TCP/IP连接。
比如在windows上连接Linux上的Mysql 实例:(Windows上安装了mysql client 配置好环境变量)
C:\Users\lihaoyang6>mysql -h112.1*6.*4.145 -u root -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
window上的客户端向112.16.4.145机器的mysql实例发起TCP/IP连接请求。在TCP/IP连接时,mysql会从mysql库下的user表里面检查IP白名单,看连上来的IP是否有权限连接