七、性能分析工具的使用
[TOC]
在数据库调优中,我们的目标就是响应时间更快,吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式
1. 数据库服务器的优化步骤当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。
整个流程划分成了观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)
可以看到数据库调优的步骤中越往金字塔尖走,其成本越高,效果越差,因此我们在数据库调优的过程中,要重点把握金字塔底部的 ==sql 及索引调优,数据库表结构调优,系统配置参数调优==等软件层面的调优
2. 查看系统性能参数可以使用 SHOW STATUS 语句查询一些数据库服务器的==性能参数和使用频率==。
其语法如下:
1SHOW [GLOBAL][SESSION] STATUES LIKE '参数';
一些常用的性能参数如下:
•Connections:连接MySQL服务器的次数。•Uptime:MySQL服务器的上线时间。•Sl ...
六、索引的创建与设计原则
[TOC]
1. 索引的声明与使用1.1 索引的分类MySQL 的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
从 功能逻辑 按照上说,索引主要有 4 种:普通索引、唯一索引、主键索引、全文索引。
按照 物理实现方式 ,索引可以分为 2 种:聚簇索引和非聚簇索引。
按照 作用字段个数 进行划分,分成单列索引和联合索引。
小结:不同的存储引擎支持的索引类型也不一样
InnoDB:支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM:支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory:支持 B-tree、Hash 等 索引,不支持 Full-text 索引;
NDB :支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive:不支 持 B-tree、Hash、Full-text 等索引;
1.2 创建索引
1、创建表的时候创建索引
==隐式的索引创建:==
1234567891011# 1.隐式的添加索引(在添加有主键约束、唯一性约束或者外键约束 ...
五、InnoDB数据存储结构
1. 数据的存储结构:页
1.1 磁盘与内存交互基本单位:页
1.2 页结构概述
1.3 页的大小
1.4 页的上层结构
2. 页的内部结构
2.1 File Header(文件头部)和File Trailer(文件尾部)2.1.1 File Header(文件头部)作用:描述各种页的通用信息。(比如页的编号、其上一页、下一页是谁等)
大小:38字节
构成:
FIL_PAGE_OFFSET(4字节)
每一个页都有一个单独的页号,就跟你的身份证号码一样,InnoDB通过页号可以唯一定位一个页。
FIL_PAGE_TYPE(2字节)
这个代表当前页的类型
FIL_PAGE_PREV(4字节)和FIL_PAGE_NEXT(4字节)
InnoDB都是以页为单位存放数据的,如果数据分散到多个不连续的页中存储的话需要把这些页关联起来,FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号。这样通过建立一个双向链表把许许多多的页就都串联起来了,保证这些页之间不需要是物理上的连续,而是逻辑上的连续。
FIL_PAGE_SPACE_OR ...
四、索引的数据结构
1. 为什么使用索引
假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示
2、索引及其优缺点2.1 索引概述
2.2 优点
类似大学图书馆建书目索引,提高数据检索的效率,==降低 数据库的 IO 成本== 这也是创建索引的主要的原因。
通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性 (唯一约束)
在实现数据的参考完整性方面,可以 加速表和表之间的连接。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度。
在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低了 CPU 的消耗。
2.3 缺点增加索引也有许多不利的方面,主要表现在如下几个方面:
创建索引和维护索引要 耗费时间 (因为索引是排好序的),并且随着数据量的增加,所耗费的时间也会增加。
索引需要占 磁盘空间,除了数据表占数据空间之 外,每一个索引还要占一定的物理空间,存储在磁盘上 ,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。
虽然索引大大提高了查询速度,同时却会降低更新表的速度。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样 ...
三、存储引擎
1. 查看存储引擎查看mysql提供什么存储引擎:
1show engines;
2. 设置系统默认的存储引擎
查看默认的存储引擎:
123show variables like '%storage_engine%'; #或SELECT @@default_storage_engine;
修改默认的存储引擎
如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
1SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改 my.cnf 文件:
123default-storage-engine=MyISAM# 重启服务systemctl restart mysqld.service
3. 设置表的存储引擎存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为 不同的表设置不同的存储引擎 ,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。
3.1 创建表时指定存储引擎我们之前创建表的语句都没有指定 ...
二、逻辑架构剖析
1. ==逻辑架构剖析==1.1 服务器处理客户端请求首先MySQL是典型的C/S架构,即Client/Server 架构‘ , 服务器端程序使用的mysqld。
不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(SQL语句) ,服务器进程处理后再向客户端进程发送一段文本(处理结果)
那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示:
下面具体展开看一下:(针对MySQL5.7)
分析
1.2 ConnectorsConnectors指的是不同语言中与SQL的交互。MySQL首先是一 个网络程序,在TCP之上定义了自己的应用层协议。所以要使用MySQL,我们可以编写代码,跟MySQL Server建立TCP连接,之后按照其定义好的协议进行交互。或者比较方便的办法是调用SDK,比如Native C API、JDBC、 PHP等各语 言MySQL Connector,或者通过ODBC。 但==通过SDK来访问MySQL,本质上还是在TCP连接上通过MySQL协议跟MySQL进行交互 ...
一、MySQL的数据目录
1. MySQL8的主要目录结构以 Linux 系统为例进行讲解:
1[root@xue ~]# find / -name mysql
安装好MySQL 8之后,我们查看如下的目录结构:
1.1 数据库文件的存放路径==MySQL数据库文件的存放路径:==/var/lib/mysql/
MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为 数据目录。
MySQL把数据都存到哪个路径下呢?其实 数据目录 对应这一个系统变量 datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了。
1234567mysql> show variables like 'datadir';+---------------+-----------------+| Variable_name | Value |+---------------+-----------------+| datadir | /var/lib/mysql/ |+-- ...



