一.mysql客户端和服务端模型
1.mysql是一个典型的C/S服务结构
1.1 mysql自带的客户端程序(/application/mysql/bin)
MySQL客户端:
1.mysql
2.mysqldump
3.mysqladmin
1.2第三方工具
1.navicat
2.sqlyog
3.phpmyadmin
1.3mysqld一个二进制程序,后台的守护进程
单进程
多线程
2MySQL的连接方式
2.1TCP/IP的链接方式
mysql -uroot -p123 -h10.0.0.52
2.2Socket套接字连接方式
#以下三种均为socket
mysql -uroot -p123 -S /tmp/mysql.sock
mysql -uroot -p123 -hlocalhost
mysql -uroot -p123
总结:
1.-h不一定都是tcp连接
2.MySQL默认使用socket连接
3.-S只允许本地连接,无法远程连接
4.tcp连接需要建立3次握手,所以MySQL默认使用socket(速度快)
二.MySQL服务器构成
2.1什么是实例?
1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。
2.2mysqld的程序结构
2.2.1连接层
1.验证用户的合法性(ip(主机域),端口,用户名,密码,)
2.提供了两种连接方式(TCP/IP Socket)
3.建立一个与SQL层连接的线程
2.2.2SQL层
1.接收连接层传来的SQL语句
2.检测语法
3.检测语义(DDL,DML,DQL,DCL),检测是show还是select?还是update?还是insert?
4.解析器,解析整条SQL语句,生成多种执行计划
5.优化器,选择解析器生成的多种执行计划中,效率最高的一种
6.执行器,将优化器,优化的最优的一种执行方式,执行
- 和存储引擎层建立连接(提供一个线程)
- 接收存储引擎层传来的结构化成表的数据
7.将数据写入缓存
8.记录日志(binlog)
2.2.3存储引擎层
1.接收SQL层传来的SQL语句
2.与磁盘交互,读取数据并结构化成表。
3.建立一个与SQL层连接的线程,将结构化成表的数据返回给SQL层。
三.MySQL的结构
3.1逻辑结构
MySQL的逻辑对象:做为管理人员或者开发人员操作的对象
- 库
- 表:(真实数据+元数据)
- 元数据:列+其他属性(大小,行数...)
- 列:列名+(数据类型+约束(非空,默认值,主键,非负...))
3.2物理结构
3.2.1 存储引擎
MyISAM存储引擎
由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。
InnoDB存储引擎
mysql 5.5版本以后默认的存储引擎
由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。
MEMORY
MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。
BLACKHOLE
黑洞存储引擎,写入的任何数据都会消失,可以应用于主备复制中的分发主库。
还可以使用第三方存储引擎:
01)MySQL当中插件式的存储引擎类型
02)MySQL的两个分支
- perconaDB
- mariaDB
3.2.2常用存储得引擎特性
innodb存储引擎的简介
在MySQL5.5版本之后,默认的存储引擎,提供高可靠性和高性能。
优点:
01)事务安全(遵从 ACID)
02)MVCC(Multi-Versioning Concurrency Control,多版本并发控制)
03)InnoDB 行级别锁定
04)Oracle 样式一致非锁定读取
05)表数据进行整理来优化基于主键的查询
06)支持外键引用完整性约束
07)大型数据卷上的最大性能
08)将对表的查询与不同存储引擎混合
09)出现故障后快速自动恢复
10)用于在内存中缓存数据和索引的缓冲区池
innodb核心特性
重点:
- MVCC
- 事务
- 行级锁
- 热备份
- Crash Safe Recovery(自动故障恢复)
MyISAMT特性
在MySQL5.5以前使用的版本,存在很多的局限不足,例如表级锁,故障自动恢复、不支持事务、不支持外键以及不支持多并发版本控制等。
3.2.3物理文件
物理文件包括:日志文件,数据文件,配置文件,pid文件,socket文件等。
日志文件
/var/log/mysqld.log【默认开启】
bin log 二进制日志 备份 增量备份 DDL DML DCL
Relay log 中继日志 复制 接收 replication master
slow log 慢查询日志 调优 查询时间超过指定值
Error Log
log-error=/var/log/mysqld.log
Binary Log
log-bin=/var/log/mysql-bin/bin.log
server-id=2 5.7.x版本后
Slow Query Log
slow_query_log=1|0
slow_query_log_file=/var/log/mysql-slow/slow.log
long_query_time=3
配置文件
#初始化配置文件的读取顺序
[root@db01 ~]# mysqld --help --verbose |grep
注:
默认情况下,MySQL启动时,会依次读取以上配置文件,如果有重复选项,会以最后一个文件设置的为准。
但是,如果启动时加入了--defaults-file=xxxx时,以上的所有文件都不会读取.
#如果冲突,以最后一个读取的为准,如果存在不同则和并所有。
#--defauls-file:默认的配置文件
如果使用./bin/mysqld_safe 守护进程启动mysql数据库时,使用了 --defaults-file=<配置文件的绝对路径>参数,这时只会使用这个参数指定的配置文件。
#[mysqld]或[server]组中包括了mysqld服务启动时的初始化参数
#[client]组中包含着客户端工具程序可以读取的参数,此外还有其他针对各个客户端软件的特定参数组等
#[mysql]或[mysqladmin]或[mysqldump]只包括客户端的某一个配置该某块的功能。
#配置标签分类
[client]所有客户端程序
mysql
mysqldump
...
[server]所有服务器程序
mysqld
mysqld_safe
....
#初始化文件的功能
1)影响实例的启动(mysqld)
2)影响客户端
mysql
mysqladmin
Mysqldump
数据文件
1、.frm文件
不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。
2、.MYD文件
myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的目录下
3、.MYI文件
也是myisam存储引擎专用,存放myisam表的索引相关信息。对于myisam存储引擎来说,可以被缓存(cache)的内容主要就是来源于.MYI文件中。
每一个myisam表对应一个.MYI文件,其存放的位置和.frm及.MYD一样
4、.ibd文件和ibdata文件
存放innoDB的数据文件(包括索引)。innoDB存储引擎有两种表空间方式:独享表空间和共享表空间。
独享表空间:使用.ibd文件来存放数据,且每个表一个.ibd文件,文件存放在和myisam数据相同的位置。
共享表空间:使用.ibdata1文件,所有表共同使用一个(或多个,自行配置,默认大小12M,空间是自增的,可以在配置文件写入生成多个文件)ibdata1文件。用来保存系统数据、临时表、undo log(事务日志)。
5、db.opt文件 此文件在每一个自建的库里都会有,记录这个库
6、5.7版本中默认会将undo和临时表独立出来,5.6版本也可以独立,只不过需要在初始化的时候进行配置
pid文件
pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,它存放着自己的进程。
socket文件
socket文件也是在Unix/Linux环境下才有的,用户在Unix/Linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接mysql。
四. 区分数据库、数据库实例、数据库服务器
数据库(database)
数据库(database):
操作系统或存储上的数据文件的集合。mysql数据库中,数据库文件可以是* .frm、*.MYD、*.MYI、*.ibd等结尾的文件,
不同存储引擎文件类型不同。
数据库实例(instance)
由后台进程或者线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。
需要注意:数据库实例才是真正操作数据库的。
数据库和数据库实例的关系:
通常情况下,数据库实例和数据库是一一对应的关系,也就是一个数据库实例对应一个数据库;
但是,在集群环境中存在多个数据库实例共同使用一个数据库。
数据库服务器(database server)
数据库服务器(database server):部署安装数据库实例的服务器。
mysql中的逻辑对象:
mysqld_process+memory+datafile|logfile|pidfile...--->库-->表-->记录(由行与列组成)
五.MySQL单位
- 段: 是由多个区组成的,理论上一张表就是一个段。
- 区: 连续的多个页构成。
- 页(块): 最小的数据存储单元,默认为16k
- 分区表: 是由一个区构成一个段,也就是一个表里有且只有一个分区。