mysql高级(尚硅谷-夏磊)

目录

内容介绍

Linux下MySQL的安装与使用

Mysql逻辑架构

Mysql存储引擎

Sql预热

索引简介


内容介绍

1、Linux下MySQL的安装与使用

2、逻辑架构

3、sql预热

Linux下MySQL的安装与使用
1、docker安装docker run -d \-p 3309:3306 \-v /atguigu/mysql/mysql8/conf:/etc/mysql/conf.d \-v /atguigu/mysql/mysql8/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 \--name atguigu-mysql8 \--restart=always \mysql:8.0.29

*查看容器

2、远程连接问题

1)问题

2)解决方案

#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码

docker exec -it atguigu-mysql8 env LANG=C.UTF-8 /bin/bash

#进入容器内的mysql命令行

mysql -uroot -p

#修改默认密码校验方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

3、字符集

MySQL 8版本之前,默认字符集为 latin1ISO-8859-1 ,不支持中文,使用前必须设置字符集为utf8utf8mb3)或utf8mb4。从MySQL 8开始,数据库的默认字符集为 utf8mb4 ,从而避免中文乱码的问题。

4sql_mode

1)是什么

Mysql提供的sql语法规范

2)实例

CREATE DATABASE atguigudb;

USE atguigudb;

CREATE TABLE employee(id INT, `name` VARCHAR(16),age INT,dept INT);

INSERT INTO employee VALUES(1,'zhang3',33,101);

INSERT INTO employee VALUES(2,'li4',34,101);

INSERT INTO employee VALUES(3,'wang5',34,102);

INSERT INTO employee VALUES(4,'zhao6',34,102);

INSERT INTO employee VALUES(5,'tian7',36,102);

需求:查询每个部门年龄最大的人

#查询每个部门年龄最大的人(错误写法)

SELECT e.`dept`,MAX(e.`age`),e.`name` FROM employee e

GROUP BY e.`dept`;

#查询每个部门年龄最大           的人

SELECT e.`dept`,MAX(e.`age`)maxage FROM employee e

GROUP BY e.`dept`;

SELECT ee.*,e.`name` FROM employee e

INNER JOIN (

SELECT e.`dept`,MAX(e.`age`)maxage FROM employee e

GROUP BY e.`dept`

)ee ON e.`dept` =ee.dept AND e.`age`= ee.maxage;

  • ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,SELECT子句中只能包含函数和 GROUP BY 中出现的字段。

Mysql逻辑架构

1、逻辑架构图

下面是MySQL5.7使用的经典架构图MySQL 8中去掉了Caches&Buffers部分:

2、客户端

MySQL服务器之外的客户端程序,与具体的语言相关,例如Java中的JDBC,图形用户界面SQLyog等。本质上都是在TCP连接上通过MySQL协议和MySQL服务器进行通信。

3、服务层

(1)连接层

第一件事就是建立 TCP 连接、身份认证、权限获取

(2)服务层

Management Serveices & Utilities 系统管理和控制工具

SQL InterfaceSQL接口:接收用户的SQL命令,并且返回用户需要查询的结果。

Parser:解析器:解析器中SQL 语句进行`词法分析、语法分析、语义分析`,并为其创建`语法树`

Optimizer:查询优化器:

 不改变查询结果前提下,调整sql顺序,生成执行计划

Caches & Buffers 查询缓存组件:在MySQL 8之后就抛弃了这个功能。

(3)引擎层

负责MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信

4、存储层

所有的数据、数据库、表的定义、表的每一行的内容、索引,都是存在文件系统 上,以文件的方式存在,并完成与存储引擎的交互。

5、执行顺序

6、SQL执行流程(MySQL8)

(1).开启profiling

SET profiling = 1;

(2)显示查询`

*执行sql

SELECT * FROM atguigudb.employee;

SELECT * FROM atguigudb.employee WHERE id = 5;

*查看计划

SHOW PROFILES;

(3)查看某个查询计划流程

SHOW PROFILE cpu,block io FOR QUERY 3;

Mysql存储引擎

1、MyISAM和InnoDB的区别

Sql预热
  1. 创建测试数据
CREATE TABLE `t_dept` (`id` INT NOT NULL AUTO_INCREMENT,`deptName` VARCHAR(30) DEFAULT NULL,`address` VARCHAR(40) DEFAULT NULL,PRIMARY KEY (`id`));CREATE TABLE `t_emp` (`id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT NULL,`age` INT DEFAULT NULL,`deptId` INT DEFAULT NULL,`empno` INT NOT NULL,PRIMARY KEY (`id`),KEY `idx_dept_id` (`deptId`)#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`));INSERT INTO t_dept(id,deptName,address) VALUES(1,'华山','华山');INSERT INTO t_dept(id,deptName,address) VALUES(2,'丐帮','洛阳');INSERT INTO t_dept(id,deptName,address) VALUES(3,'峨眉','峨眉山');INSERT INTO t_dept(id,deptName,address) VALUES(4,'武当','武当山');INSERT INTO t_dept(id,deptName,address) VALUES(5,'明教','光明顶');INSERT INTO t_dept(id,deptName,address) VALUES(6,'少林','少林寺');INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(1,'风清扬',90,1,100001);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(2,'岳不群',50,1,100002);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(3,'令狐冲',24,1,100003);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(4,'洪七公',70,2,100004);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(5,'乔峰',35,2,100005);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(6,'灭绝师太',70,3,100006);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(7,'周芷若',20,3,100007);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(8,'张三丰',100,4,100008);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(9,'张无忌',25,5,100009);INSERT INTO t_emp(id,NAME,age,deptId,empno) VALUES(10,'韦小宝',18,NULL,100010);

2、常见七种JOIN查询

(1)查询所有有部门的员工信息以及他所在的部门信息SELECT * FROM t_emp a INNER JOIN  t_dept b ON a.`deptId` = b.`id`;(2)需求2:查询所有用户,并显示其部门信息(如果员工没有所在部门,也会被列出) => 查询A的全集SELECT * FROM t_emp a LEFT JOIN t_dept b ON a.`deptId`= b.`id`;(3)需求3:列出所有部门,并显示其部门的员工信息(如果部门没有员工,也会被列出)=> 查询B的全集SELECT * FROM t_dept b LEFT JOIN t_emp a ON a.`deptId`= b.`id`;(4)**需求4:**查询`没有加入任何部门的员工`SELECT * FROM t_emp a LEFT JOIN t_dept b ON a.`deptId`= b.`id` WHERE b.`id` IS NULL;(5)查询没有任何员工的部门SELECT * FROM t_dept b LEFT JOIN t_emp a ON a.`deptId`= b.`id`WHERE a.`id` IS NULL;(6)查询所有员工和所有部门 => AB全有SELECT a.*,b.* FROM t_emp a LEFT JOIN t_dept b ON a.`deptId`= b.`id`UNION ALLSELECT a.*,b.* FROM t_dept b LEFT JOIN t_emp a ON a.`deptId`= b.`id`WHERE a.`id` IS NULL;(7)查询没有加入任何部门的员工,以及查询出部门下没有任何员工的部门SELECT a.*,b.* FROM t_emp a LEFT JOIN t_dept b ON a.`deptId`= b.`id`WHERE b.`id` IS NULLUNION ALLSELECT a.*,b.* FROM t_dept b LEFT JOIN t_emp a ON a.`deptId`= b.`id`WHERE a.`id` IS NULL;

3、修改表,增加难度

(1)增加掌门人字段ALTER TABLE t_dept ADD CEO INT(11);UPDATE t_dept SET CEO=2 WHERE id=1;UPDATE t_dept SET CEO=4 WHERE id=2;UPDATE t_dept SET CEO=6 WHERE id=3;UPDATE t_dept SET CEO=8 WHERE id=4;UPDATE t_dept SET CEO=9 WHERE id=5;(2)求各个门派对应的掌门人SELECT * FROM t_emp a INNER JOIN t_dept bON b.`CEO` = a.`id`;(3)求所有掌门人的平均年龄SELECT AVG(a.`age`) FROM t_emp a INNER JOIN t_dept bON b.`CEO` = a.`id`;(4)求所有人物对应的掌门名称(4种写法分析)#1 NO3SELECT ab.name,c.`name` ceoname FROM(SELECT a.`name`,b.`CEO` FROM t_emp aLEFT JOIN t_dept b ON a.`deptId`=b.`id`)abLEFT JOIN t_emp c ON ab.ceo=c.`id`;#2 NO2SELECT c.name,ab.name ceoname FROM t_emp c LEFT JOIN(SELECT a.`name`,b.`id` FROM t_emp aINNER JOIN t_dept b ON b.`CEO` = a.`id`)abON c.`deptId`= ab.id;#3  NO1SELECT a.`name`,c.`name` ceoname FROM t_emp aLEFT JOIN t_dept b  ON a.`deptId`= b.idLEFT JOIN t_emp c ON b.`CEO`= c.`id`;#4  NO4SELECT a.`name`,(SELECT c.name FROM t_emp c WHERE c.id =b.`CEO`)ceonameFROM t_emp aLEFT JOIN t_dept b ON a.`deptId`=b.`id`;

索引简介

1、是什么

索引(Index)是帮助MySQL高效获取数据的数据结构。

排好序的快速查找数据结构

2、索引优缺点

(1)优点:查询快、排序快

(2)缺点:所有写操作变慢

                 占用大量磁盘空间

3、索引分类

  • 从功能逻辑上划分,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引
  • 按照作用字段个数划分,索引可以分为单列索引和联合索引
  • 按照物理实现方式划分 ,索引可以分为 2 种,分别是聚簇索引和非聚簇索引

4、树

(1)二叉树

对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。

*最好情况

*最坏情况

(2)平衡二叉树(AVL)

具有以下特点:

  • 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1
  • 并且左右两个子树都是一棵平衡二叉树。

缺点

那么磁盘的IO次数和索引树的高度是相关的。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。

解决问题,可以使用平衡三叉树

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77339.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xilinx A7开发板LVDS IO无输出问题解决方法

使用A7-35T FGG484的FPGA开发板bank16上的IO作为差分LVDS的输入输出,搭建输入输出测试工程发现LVDS可以输入、无法输出。查阅UG471,找到如下信息: 手册中已经针对A7的LVDS做了明确的应用说明: (1)HP bank上…

观察者模式——对象间的联动

1、简介 1.1、概述 在软件系统中,有些对象之间也存在类似交通信号灯和汽车之间的关系。一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联动,正所谓“触一而牵百发”。为了更好地描述对象之间存在的这种一…

第一个maven项目(IDEA生成)

第一个maven项目(IDEA生成) 步骤1 配置Project SDK 步骤2 配置maven File->Settings搜索maven

CHI(六)独占访问

AMBA5 CHI Architecture Specification IssueF 1. overview 独占访问的原则是,执行独占序列的逻辑处理器(LP)执行以下操作: 对一个地址执行exclusive load。计算要存储到该位置的新值。对该地址进行exclusive store。 支持对可…

Java并发系列之二:悲观锁机制

什么是锁 在并发环境下,会出现多个线程对同一个资源进行争抢的情况,假设A线程对资源正在进行修改,此时B线程此时又对资源进行了修改,这就可能会导致数据不一致的问题。为了解决这个问题,很多编程语言引入了锁机制&…

RocketMQ发送消息超时异常

说明:在使用RocketMQ发送消息时,出现下面这个异常(org.springframework.messging.MessgingException:sendDefaultImpl call timeout……); 解决:修改RocketMQ中broke.conf配置,添加下…

【JAVASE】多态

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 多态 1. 概念2. 实现条件3. 重写4. 向上…

wordpress 学习贴

安装问题 我的使用环境为docker环境,php、nginx、mysql分别处于3个容器中, 提示异常,打开debug模式,会发现 No such file or directory Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 这个其实问题其…

【C++】开源:sqlite3数据库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍sqlite3数据库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…

【FAQ】如何隐藏网页H.265播放器EasyPlayer.js的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台,集成的都是EasyPlayer.js版播放器,它属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,包括WebSocket-FLV、HTTP-FLV,HLS(m3u8&#x…

MySQL建表和增添改查

1.创建一个名为mydb的数据库 mysql> show database mydb; 查询 mysql> show database mydb; 2.创建一个学生信息表 mysql> create table mydb.student_informtion( -> student_id int UNSIGNED NOT NULL PRIMARY KEY, //非空(不允许为空&#xff0…

unity如何手动更改脚本执行顺序

在Unity中,脚本的执行顺序是由脚本的执行顺序属性决定的。默认情况下,Unity根据脚本在项目中的加载顺序来确定它们的执行顺序。然而,你可以手动更改脚本的执行顺序,以下是一种方法: 在Unity编辑器中,选择你…

PCIE上位机用什么工具?

可以了解一下神电测控出器的My FPGA开发套件,它可以用来开发FPGA板卡与上位机之间PCIE通信,而且就是用LabVIEW FPGA开发。它使用的是Xillybus PCIe IP核,神电将其封装成了在 LabVIEW FPGA 下的 PCIe CLIP 组件,可以方便的使用。而…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包,提供机器学习实验所需的可视化和工具,该工具的功能如下: 跟踪和可视化指标,例如损失和精度可视化模型图(操作和层)查看权重、偏差或其…

kafka部署

1.kafka安装部署 1.1 kafaka下载 https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-2.4.0.tgz Binary downloads是指预编译的软件包,可供直接下载和安装,无需手动编译。在计算机领域中,二进制下载通常指预构建的软件分发包,可以直接安装在系统上并使用 "2.…

MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

文章目录 通过动态链表实现游戏角色动态增加CMemoryDC.hCFlashDlg.hCFlashDlg.cpp WM_ERASEBKGND背景刷新的原理RegisterClass注册窗口与框架程序开发CFrameRegister 通过动态链表实现游戏角色动态增加 CMemoryDC.h #pragma once#include "resource.h"/*内存DC类简介…

JavaWeb三大组件 —— Servlet

目录 servlet 注册servlet 父pom pom文件 1、通过注解注册 2、使用ServletRegistrationBean注册 API三生三世 第一生Servlet 第二生SpringMVC 今生SpringBoot servlet Servlet的作用: 接受请求参数、处理请求,响应结果,(就…

了解 spring MVC + 使用spring MVC - springboot

前言 本篇介绍什么是spring MVC ,如何使用spring MVC,了解如何连接客户端与后端,如何从前端获取各种参数;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1. 什么…

Vue 全局事件总线 Event-Bus

全局事件总线 作用:可以在全局层面上,在任意组件之间相互传递数据。不再局限于父子组件传值,或多层嵌套传值等方式。 使用方式:完全与父子组件传值一致,使用 $on 监听事件,使用 $emit 触发事件&#xff0c…

el-tooltip设置文字溢出时展示否则不展示

改写el-tooltip使其支持文字溢出时展示否则不展示,而不是需要使用js设置单独控制 新建 src/utils/rewriteElTooltip.js (一模一样 cv就行) export default function rewriteElTooltip(el) {el.props {...el.props,overflow: Boolea…