MySQL高级——数据库优化(上)

mysql基础学习视频:https://www.bilibili.com/video/BV1xW411u7ax?p=1

一、MySQL的架构介绍

MySQL简介

概述

在这里插入图片描述

高级MySQL

在这里插入图片描述

MySQL 安装

这里用docker来安装,版本是8.0.18。

# 拉取镜像
docker pull mysql:8.0.18

# 运行一(现在我用的mysql之前用的运行命令)
docker run -p 33060:3306 --name mysql8_33060 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.18

# 容器内mysql重要文件/目录位置
# /etc/mysql/my.cnf  -> 映射配置文件
# /var/lib/mysql -> 映射数据

# 运行二		-v 对容器内的目录进行挂载
docker run -p 33060:3306 --name mysql8_33060 \
-v /home/docker/mysql8_33060/conf.d/my.cnf:/etc/mysql/my.cnf \
-v /home/docker/mysql8_33060/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.18

#在本地打开一个终端,进入容器的mysql(-h填linux的ip地址)
mysql -uroot -p123456 -h10.211.55.26 -P33060
#查看所有数据库
show databases;

#创建数据库
create database db01;

#切换数据库
use db01;

#查看此数据库下的所有表
show tables;

#创建表
create table user(id int not null,name varchar(20));

#插入数据
insert into user values(1,'张三');

#查看user表所有数据(显示的数据没有出现乱码)
select * from user;

MySQL逻辑架构介绍

总体概览

在这里插入图片描述

MySQL逻辑架构

在这里插入图片描述

1. 连接层

在这里插入图片描述

2. 服务层

在这里插入图片描述

3. 引擎层

在这里插入图片描述

4. 存储层

在这里插入图片描述

MySQL存储引擎

查看命令

show engines;
在这里插入图片描述
show variables like '%storage_engine%';
在这里插入图片描述

对比 MyISAM 和 InnoDB

在这里插入图片描述
MyISAM关注的是性能
InnoDB关注的是事务

阿里与淘宝

在这里插入图片描述

二、索引优化分析

性能问题

性能下降SQL慢:执行时间长,等待时间长。

  1. 查询语句写的不好

  2. 索引失效

    • 单值
      在这里插入图片描述

    • 复合
      在这里插入图片描述

  3. 关联查询太多join(设计缺陷或不得已的需求)

  4. 服务器调优及各个参数设置(缓冲、线程数等)

常见通用的Join查询

SQL执行顺序

手写

在这里插入图片描述

机读

在这里插入图片描述
对于mysql而言,机读的时候从from开始。

总结

在这里插入图片描述

Join图

在这里插入图片描述

内连接

左右表共有的部分
select <select_list> from tableA A inner join tableB B on A.key = B.key
在这里插入图片描述

左连接

左表的全部:左右表共有的和左表独有的部分
select <select_list> from tableA A left join tableB B on A.key = B.key
在这里插入图片描述

左连接(不包括公共部分)

左表独有的部分
select <select_list> from tableA A left join tableB B on A.key = B.key where B.key is null
在这里插入图片描述

右连接

右表的全部:左右表共有的和右独有的部分
select <select_list> from tableA A right join tableB B on A.key = B.key
在这里插入图片描述

右连接(不包括公共部分)

右表独有的部分
select <select_list> from tableA A right tableB B on A.key = B.key where A.key is null
在这里插入图片描述

全连接

全部
select <select_list> from tableA A full outer join tableB B on A.key = B.key
在这里插入图片描述

全连接(不包括公共部分)

左表独有的和右表独有的部分
select <select_list> from tableA A full outer join tableB B on A.key = B.key where A.key is null or B.key is null
在这里插入图片描述

建表SQL

CREATE DATABASE db02;

USE db02;

#部门表
CREATE TABLE `tbl_dept` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`deptName` VARCHAR(30) DEFAULT NULL,
	`locAdd` VARCHAR(40) DEFAULT NULL,
	PRIMARY KEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

#员工表
CREATE TABLE `tbl_emp` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(20) DEFAULT NULL,
	`deptId` INT(11) DEFAULT NULL,
	PRIMARY KEY(`id`)
	#CONSTRAINT `fk_dept_id` FOREIGN KEY(`deptId`) REFERENCES `tbl_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('RD',11);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('HR',12);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('MK',13);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('MIS',14);
INSERT INTO `tbl_dept`(`deptName`,`locAdd`)VALUES('FD',15);

INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z3',1);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z4',1);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('z5',1);

INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('w5',2);
INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('w6',2);

INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s7',3);

INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s8',4);

INSERT INTO `tbl_emp`(`name`,`deptId`)VALUES('s9',51);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7种JOIN

  1. 内连接:select * from tbl_emp a inner join tbl_dept b on a.deptId = b.id;
    在这里插入图片描述

  2. 左连接:select * from tbl_emp a left join tbl_dept b on a.deptId = b.id;
    在这里插入图片描述

  3. 左连接(不包括公共部分):select * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null;
    在这里插入图片描述

  4. 右连接:select * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
    在这里插入图片描述

  5. 右连接(不包括公共部分):select * from tbl_emp a right join tbl_dept b on a.deptId = b.id where a.deptId is null;
    在这里插入图片描述

  6. 全连接:select * from tbl_emp a left join tbl_dept b on a.deptId = b.id union select * from tbl_emp a right join tbl_dept b on a.deptId = b.id;
    union自带去重。
    在这里插入图片描述

    mysql不支持全连接这种语法:
    在这里插入图片描述

  7. 全连接(不包括公共部分):select * from tbl_emp a left join tbl_dept b on a.deptId = b.id where b.id is null union select * from tbl_emp a right join tbl_dept b on a.deptId = b.id where a.deptId is null;
    在这里插入图片描述

索引简介

在这里插入图片描述
在这里插入图片描述
索引是数据结构,可以简单理解为“排好序查找快的数据结构”,所以,对查找和排序都有影响。

详解(重要)

在这里插入图片描述

结论

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优势

在这里插入图片描述

劣势

在这里插入图片描述

mysql索引分类
  1. 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。索引列的值必须唯一,但允许有空值。
  2. 唯一索引:即一个索引包含多个列。
  3. 复合索引:

基本语法:
在这里插入图片描述
使用ALTER命令:
在这里插入图片描述

mysql索引结构
  1. BTree索引
    索引原理:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. Hash索引
  3. full-text全文索引
  4. R-Tree索引
需要创建索引的情况

在这里插入图片描述

不需要创建索引的情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

性能分析

MySQL Query Optimizer

在这里插入图片描述

MySQL常见瓶颈

在这里插入图片描述

Explain

是什么(查看执行计划)

在这里插入图片描述
官方文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

能干嘛

在这里插入图片描述

怎么玩

在这里插入图片描述
在这里插入图片描述

各字段解释
id(重要)

在这里插入图片描述
有三种情况:

  1. id相同,执行顺序由上至下
    在这里插入图片描述
  2. id不同,如果是子査询,id的序号会递增,id值越大优先级越高,越先被执行。
    在这里插入图片描述
  3. id相同的和不同的,同时存在。
    在这里插入图片描述
select_type

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

table

显示这一行的数据是关于哪张表的。

type(重要)

在这里插入图片描述
访问类型排列:
在这里插入图片描述
常用的类型排列:
在这里插入图片描述
在这里插入图片描述

  1. system(系统表,基本不会出现)在这里插入图片描述

  2. const(单表主键查询,结果唯一)
    在这里插入图片描述
    在这里插入图片描述

  3. eq_ref(多表主键联合查询,结果唯一)
    在这里插入图片描述
    在这里插入图片描述
    const是单表唯一,where用主键中查询单条记录,而eq_ref是多表关联,上面多表查询的where条件是t1.id=t2.id,而此id只有一个,只能查到一条记录,而得到两张表的字段。
    所以,const是单表查询结果唯一,而eq_ref是多表查询结果唯一。(如查找条件为主键)

  4. ref(查询指定值,结果可能不唯一)
    在这里插入图片描述
    在这里插入图片描述
    如查找条件为姓名这种可能重复,查找后可能得到多条数据。

  5. range(查询一个范围的值,范围查询)
    在这里插入图片描述
    在这里插入图片描述
    查询条件指定一个范围(between、>、<、in),而不是单个值。

  6. index(全索引查询)
    在这里插入图片描述
    在这里插入图片描述
    只扫描全索引。

  7. ALL(全表查询)
    在这里插入图片描述
    在这里插入图片描述
    扫描全表,百万级别的数据时要避免全表扫描,需要优化。

在这里插入图片描述

possible_keys

在这里插入图片描述
理论上会用到的索引,null为没使用索引。

key(重要)

在这里插入图片描述
在这里插入图片描述
实际上使用的索引,null为没使用索引,或索引失效。

key_len

在这里插入图片描述
在这里插入图片描述

ref

在这里插入图片描述
在这里插入图片描述

rows(重要)

在这里插入图片描述
在这里插入图片描述
越少越好。

filtered

5.7之后的版本就有了这个字段,不需要使用explain extended。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比,不是具体记录数)。

Extra(重要)

在这里插入图片描述

  1. Using filesort
    在这里插入图片描述
    在这里插入图片描述
    文件内排序,内部重新进行排序。

  2. Using temporary
    在这里插入图片描述
    在这里插入图片描述
    内部创建临时表。

  3. Using index
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. Using where:
    在这里插入图片描述

  5. Using join buffer:
    在这里插入图片描述

  6. impossible where:
    在这里插入图片描述
    在这里插入图片描述

  7. select tables optimized away:
    在这里插入图片描述

  8. distinct:
    在这里插入图片描述

热身Case

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

因为接下来的索引优化篇幅有点长,所以单独放到了下一篇里。

下一篇笔记:MySQL高级——数据库优化(中)

学习视频(p1-p30):https://www.bilibili.com/video/BV1KW411u7vy?p=1

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值