零基础入门 全角度解读企业主流数据库MySQL8.0 --- 复习笔记

零基础入门 全角度解读企业主流数据库MySQL8.0 --- 复习笔记

    • 第1章 【蓦然回首】开篇引导【少年,奋斗吧】
      • 1-1 【良好的开端】课程序言 试看
    • 第2章 【上帝视角】技术选型之数据库选型【适用于志存高远的有志青年】
      • 2-1 NoSQL和SQL
      • 2-2 【天生我材必有用】关系型数据库的特点和适用场景
      • 2-3 【英雄的用武之地】非关系型数据库的特点和适用场景
      • 2-4 【心中有数】关系统型数据库选型步骤
      • 2-5 【合适比喜欢更重要】为项目选择适合的数据库---为什么使用mysql?
      • 2-6 【动动手】下载安装VirtualBox
      • 2-7 【装备就绪】准备虚拟服务器
      • 2-8 【跟着做】安装CentOS系统
      • 2-9 【动动手】配置CentOS系统
      • 2-10 【认真听】部署MySQL8.0.15之简介
      • 2-11 【认真看】部署MySQL8.0.15
      • 2-12 【动手做】配置MySQL8.0.15
      • 2-13 【跟上节奏】初始化MySQL8.0.15
      • 2-14 【知识回顾】本章总结.
    • 第3章 【设计师视角】关于数据库设计-程序猿必备技【适用于让你的才华撑起你的野心】
      • 3-1 【前情提要】数据库结构设计N部曲
      • 3-2 实战项目需求分析
      • 3-3 实战项目需求总结
      • 3-4 宽表模式
      • 3-5 宽表模式的数据更新异常
      • 3-6 宽表模式的数据插入异常
      • 3-7 宽表模式的适用场景
      • 3-8 数据库第一设计范式
      • 3-9 数据库第二设计范式
      • 3-10 数据库第三设计范式;
      • 3-11 【面向对象设计】根据设计范式对【课程对象】逻辑建模
      • 3-12 【面向对象设计】根据设计范式对【课程列表对象】逻辑建模
      • 3-13 【面向对象设计】根据设计范式对【用户对象】逻辑建模
      • 3-14 【面向对象设计】根据设计范式对【问答评论对象】逻辑建模
      • 3-15 【面向对象设计】根据设计范式对【课程评价对象】进行逻辑建模
      • 3-16 【面向对象设计】根据设计范式对项目进行逻辑建模-总结
      • 3-17 范式化设计存在的问题
      • 3-18 反范式化设计
      • 3-19 反范式化设计总结
      • 3-20 物理设计-常用的MySQL存储引擎
      • 3-21 物理设计-INNODB存储引擎的特点
      • 3-22 物理设计-跟据Innodb优化项目表结构
      • 3-23 物理设计-跟据Innodb优化项目表结构
      • 3-24 物理设计-整数类型的特点
      • 3-25 物理设计-实数(小数)类型的特点
      • 3-26 物理设计-实战实数类型的特点
      • 3-27 物理设计-时间类型的特点
      • 3-28 物理设计-实战时间类型的特点
      • 3-29 物理设计-字符串类型的特点
      • 3-30 物理设计-为列选择适合的数据类型-建议
      • 3-31 物理设计-为列选择适合的数据类型-建议
      • 3-32 为课程表选择合适的数据类型
      • 3-33 为章节表选择合适的数据类型
      • 3-34 为用户表选择合适的数据类型
      • 3-35 为项目中的其它表选择合适的数据类型
      • 3-36 数据库对像命名原则一
      • 3-37 数据库对像命名原则二
      • 3-38 为项目数据库对像命名
      • 3-39 本章总结
    • 第4章 【众生视角】访问数据库的N种武器和姿势【必要常识】
      • 4-1 使用命令行工具访问MySQL
      • 4-2 使用SQLyog, navicat访问MySQL
      • 4-3 解锁Python的M3ySQL驱动类库
      • 4-4 实战部署Python的MySQL驱动类库
      • 4-5 开发Python操作MySQL数据库
      • 4-6 排查MySQL1045错误解决访问异常
      • 4-7 排查MySQL1153错误解决访问异常
      • 4-8 本章总结
    • 第5章 【极客视角】玩转SQL开发“道”与“术”之道篇【适用于日常工作】
      • 5-1 【开始起航】初识SQL
      • 5-2 【解锁】数据库访问控制语句
      • 5-3 【详解】数据库账号创建命令
      • 5-4 【实战】 创建项目数据库账号
      • 5-5 【解锁】 数据库用户授权语句
      • 5-6 【详解】数据库用户授权命令
      • 5-7 【实战】数据库用户授权语句.
      • 5-8 【工作填坑技能】为数据库用户授权时易犯错误
      • 5-9 【实操】使用Revoke回收数据库用户权限
      • 5-10 【实战必会】 常用的DDL语句-1
      • 5-11 【实战必会】 常用的DDL语句-2
      • 5-12 【实战】 创建项目数据库imc_db
      • 5-13 【解锁】使用create table建立表
      • 5-14 【解锁】使用alter table修改表
      • 5-15 【解锁】使用drop table删除表
      • 5-16 【解析】建立项目课程表
      • 5-17 【解析】建立项目课程相关表
      • 5-18 【解析】建立问答相关表
      • 5-19 【实战】 建立项目中的表
      • 5-20 【必知】索引维护语句
      • 5-21 【必会】其它DDL语句的用法
    • 第6章 【极客视角】玩转SQL开发“道”与“术”之术篇【工作高阶技能】
      • 6-1 【初识】DML语句
      • 6-2 【提升思维】编写Insert语句的思路
      • 6-3 【开发常用】实战insert语句
      • 6-4 【开发必备】使用select语句查询表中的数据
      • 6-5 使用Where子句过滤表中的行
      • 6-6 使用比较运算符过滤数据
      • 6-7 【实战】MySQL中的比较运算符-1
      • 6-8 【实战】MySQL中的比较运算符-2
      • 6-9 【面试常问】使用逻辑运算符关联多个过滤条件
      • 6-10 【实战】MySQL逻辑运算符-1
      • 6-11 【实战】 MySQL逻辑运算符-2
      • 6-12 【解锁】从多个表中查询数据
      • 6-13 【实战】使用内关联查询多个表中的数据
      • 6-14 【解锁】外联接查询
      • 6-15 【实战】 外关联查询
      • 6-16 使用Group by 分组查询结果
      • 6-17 【实战】分组统计查询
      • 6-18 使用having子句过滤分组结果
      • 6-19 MySQL中的分组函数-1
      • 6-20 MySQL中的分组函数-2
      • 6-21 MySQL中的分组函数-3
      • 6-22 使用order by子句排序查询结果
      • 6-23 使用Limit子句限制返回的行数
      • 6-24 【解锁】使用Create View语句创建视图
      • 6-25 【初识】数据删除语句 Delete
      • 6-26 【实战】使用Delete语句删除数据
      • 6-27 【初识】 数据更新语句Update
      • 6-28 【实战】使用Update语句修改数据
      • 6-29 使用SQL获取数据库时间
      • 6-30 使用SQL转换时间数据
      • 6-31 使用SQL进行时间计算
      • 6-32 使用SQL提取部分时间值
      • 6-33 使用SQL拼接字符串
      • 6-34 使用SQL判断字符串的长度
      • 6-35 使用SQL截取字符串'
      • 6-36 使用SQL按分隔符处理数据
      • 6-37 MySQL()中的其它常用函数
      • 6-38 【解锁】MySQL8.0新增的公共表表达式
      • 6-39 【实战】 公共表表达式-1
      • 6-40 【实战】 公共表表达式-2
      • 6-41 【解锁】MySQL8.0新增的窗口函数
      • 6-42 【实战】 窗口函数-1
      • 6-43 【实战】 窗口函数-2
      • 6-44 【实战】 窗口函数-3
      • 6-45 【警惕】SQL开发中易犯的错误-1
      • 6-46 【警惕】 SQL开发中易犯的错误-2
      • 6-47 章节总结;
    • 第7章 【专家视角】 揭开SQL优化神秘面纱【适用于升职加薪】
      • 7-1 优化sql的一般步骤:
      • 7-2 发现sql慢的渠道:
      • 7-3 分析执行计划:
    • 第8章 【专家视角】SQL的索引优化之向面试开炮&吊打面试官
          • sql优化的手段:
          • Innodb支持的索引类型:
          • Btree索引特点: 平衡二叉树
          • 在哪些列上建立索引:
          • 最终的目的:
          • 选择复合索引键的顺序:
          • 索引使用的误区:
          • SQL改写的原则
      • 第9章 【架构师视角】搞定数据库并发高压,服务器永不宕机【可用于彰显你的眼界&格局】
      • 事务和并发控制
    • innodb的隔离级别
          • 如何处理阻塞:
    • 第10章 【青春不散场】课程总结,彰显重点【知识梳理,重塑知识栈】
      • 10-1 课程回顾及展望
      • 10-2 课程回顾及展望-续

〖课程介绍〗:
本课程遵循“用户体验至上”的原则,不敢说设计精良,尽善尽美,却也竭尽全力去锻造良好的学习体验。包含三方面,(1)设计之初:遵循“有教无类,教学相长”的原则;(2)学习路线:采用循序渐进的教学模式,带你从了解到熟悉,到掌握,到精通,最后到深谙;(3)学习内容:课程遵循前沿性,以当前最新企业主流的MySQL8.0版本为内容。以“实用”为课程最高宗旨,带你搞定工作中SQL优化 痛点问题,最终的目的是:助力个人能力的快速提升,最终服务工作所需,助你占据不可替代的一席之地

第1章 【蓦然回首】开篇引导【少年,奋斗吧】

1-1 【良好的开端】课程序言 试看

学习环境: Centos7 mysql8

开篇将告诉同学们这几件事:

1、为什么设计本课程?课程将帮助你Get到什么。
2、课程适合人群?针对特定的人将收获什么。 
3、课程提供什么样的服务?如:查漏补缺问题库、答疑服务、QQ群人脉资源... 
4、课程内容有哪些?通过思维导图,直观清晰呈现课程所涵盖丰富内容。
5、课程学习的路线/个人成长路线是怎样的?

本课程期望平滑过度到高级模式

  1. 数据库选型
  2. 数据建模
  3. 数据库访问
  4. SQL开发
  5. SQL优化
  6. 事务和高并发

第2章 【上帝视角】技术选型之数据库选型【适用于志存高远的有志青年】

技术选型,带大家从一开始就高起点,赢在起跑线上。本章主要内容就是来比较一下常见的两种数据存储系统关系型数据库和非关系型数据库的主要特点,以及他们各自适用的场景,让我们在做出选择时不再迷茫。

2-1 NoSQL和SQL

问题: 如何做数据库选型?

按照操作方式分为:
SQL(使用SQL语言操作数据的):                     Mysql   Oracle  SQLServer  PostGreSQL
NoSQL, not only SQL (不仅仅使用SQL语言操作数据):MongoDB   Redis Hadoop  HBase

NoSQL 和 SQL都有其擅长的领域

2-2 【天生我材必有用】关系型数据库的特点和适用场景

关系数据库的特点:

1. 数据结构化存储在二维表中。支持关联操作(现在部分NoSQL也支持关联,不过仅限于json类型)
2. 支持事务的ACID特性
3. 支持使用SQL语言对存储在其中的数据进行操作。

适用场景:

1. 数据之间存在一定关系,需要关联查询的数据场景
2. 需要严格的对事务支出的场景
3. 需要使用SQL语言支持的场景

2-3 【英雄的用武之地】非关系型数据库的特点和适用场景

非关系型数据库的特点:

1. 存储结构灵活, 没有固定的结构
2. 事务支持比较弱,因为不需要对数据的完整性做检查,对数据的并发处理性能高。 很适合做日志记录
3. 大多不适用SQL语言操作数据
4. 存储大小比关系型数据库的大

适用场景:

1. 适合对数据完整度不高,读写并发较大的场景
2. 数据机构不固定的场景  --  比如日志场景
3. 因为不支持sql语言,  适合对数据操作比较简单的场景

2-4 【心中有数】关系统型数据库选型步骤

  1. 数据库使用的广泛性(是否已经被广泛使用了)
  2. 数据库的可扩展性
  3. 数据库的安全性和稳定性
  4. 数据库所支持的系统
  5. 数据库的使用成本

2-5 【合适比喜欢更重要】为项目选择适合的数据库—为什么使用mysql?

数据库使用的排名

mysql的可扩展性

支持基于二进制日志的逻辑复制
存在多种第三方数据库中间层. 支持读写分离

mysql的安全性和稳定性

mysql可以主从复制集群可达到90%的可用性
mysql数据进行安全分级控制  

mysql支持win和linux系统

mysql有社区版本,是免费的。 和收费版的区别主要是工具方面, 而且使用人员众多,生态好

2-6 【动动手】下载安装VirtualBox

https://www.virtualbox.org/wiki/Downloads

2-7 【装备就绪】准备虚拟服务器

新建虚拟电脑 => 填写名称 => 类型是redhat => 选择虚拟机位置(d:/)=> 选择20G(动态分配) => 添加镜像

=> 然后设置: 网络选择桥接网卡 => 存储选择iso文件 => 最后启动无脑下一步即可

2-8 【跟着做】安装CentOS系统

填写centos的密码等操作 => 然后reboo 完成整个centos的安装

2-9 【动动手】配置CentOS系统

# 配置网络:
cd /etc/sysconfig/network-scripts/
sudo vim ifcfg-enp0s3

# 修改一些配置

BOOTPROTO=none
IPV6INIT=no
ONBOOT=yes
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8

# wq保存

# 修改下主机名  https://www.cnblogs.com/yinfutao/p/10620035.html 
vi /etc/hostname
# 或者使用这个命令
hostnamectl set-hostname cenos7-a

# 重启
reboot

2-10 【认真听】部署MySQL8.0.15之简介

https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz

2-11 【认真看】部署MySQL8.0.15

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz
tar xvf  mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz
mv  mysql-8.0.15-linux-glibc2.12-x86_64   /usr/local/mysql

2-12 【动手做】配置MySQL8.0.15

# 建立mysal用户
adduser mysql
# 配置mysql  (data, undo等目录)
vim /etc/my.cnf
cd  /usr/local/mysql
mkdir  data  sql_log undo
chown  mysql:mysql  -R data sql_log undo

2-13 【跟上节奏】初始化MySQL8.0.15

vi  /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
# 初始化mysql
mysqld  --initialize  --user=mysql --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data
# 启动msyql服务
cd  support-files/
cp  mysql.server  /etc/init.d/mysqld
/etc/init.d/mysqld  start
ps  ef | grep mysql

#查询初始密码
cd sql_log/
grep  password  mysql-error.log

# 登录mysql
mysql -uroot -p

# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'

# 重新登陆
mysql -u root  -p

2-14 【知识回顾】本章总结.

第3章 【设计师视角】关于数据库设计-程序猿必备技【适用于让你的才华撑起你的野心】

本章节“三部曲”,程序猿的必备技: 1、前奏:【业务分析】欲善其事,必三思而行; 2、高潮:【逻辑设计】范式化VS反范式化; 3、结束:【物理设计】存储引擎&数据类型&命名规约。

3-1 【前情提要】数据库结构设计N部曲

1.业务分析。
2.逻辑设计。
3.数据类型。
4.对象命名。
5.建立库表。

3-2 实战项目需求分析

模仿慕课网。

要根据功能点,分析出需要哪些表,哪些实体

3-3 实战项目需求总结

确定这些实体对应的属性:

课程的属性。主标题,副标题。方向分类,难度,最新最热产品,时长等

课程里列表的属性

讲师的属性

问答评论属性。

笔记属性。

用户的属性。

评价的属性

3-4 宽表模式

宽表模式就是所有的属性都写在一张表

宽表模式存在的问题:

数据冗余,相同的数据在一个表里面出现了多次。

3-5 宽表模式的数据更新异常

数据更新异常:修改一行中某列的值时,同时修改了多行数据。

3-6 宽表模式的数据插入异常

数据插入异常:部分数据由于缺失主键信息而无法写入表中。

数据删除异常:删除某一数据时,不得不删除另一数据。

3-7 宽表模式的适用场景

配合列存储的数据报表应用。

3-8 数据库第一设计范式

表中的所有字段是不可以再分的。

比如  联系方式 这个字段,还可以在分为 电话 邮箱 微信。  那么联系方式这个字段就是违反了第一范式的

3-9 数据库第二设计范式

表中必须存在业务主键,并且非主键依赖于全部业务主键。业务主键指的不是Id,而是一个能够标识一条记录唯一的单列和多列的组合。

比下面这个表就不符合第二范式

笔记表:
用户   章节  标题  内容  用户积分  时间

笔记表的业务主键是 : 用户 章节 和标题 组成的复合主键
其中 ”用户积分“ 只依赖于 用户这个字段,  没有依赖于全部的业务主键。 因此就违反了第二范式

3-10 数据库第三设计范式;

表中的非主键列之间不能相互依赖。(满足前两个凡事依然不能解决数据冗余的问题)

课程表:
主标题(pk)  方向 分类  难度  讲师名  讲师职位  综合评分


其中   讲师职位 是依赖于 讲师名的, 所以不符合第三范式

3-11 【面向对象设计】根据设计范式对【课程对象】逻辑建模

对课程对象表进行逻辑建模。

分析属性:  主标题  副标题  方向  分类  难度 最新 最热  时长  简介  人数  需知  收获 讲师昵称 等等

根据三范式限制,将属性分到不同表:
课程表
分类表: 分类不完全是课程表的属性,不满足第二范式, 所以可以单独提出来
讲师表: 讲师不完全是课程表的属性,不满足第二范式, 所以可以单独提出来

3-12 【面向对象设计】根据设计范式对【课程列表对象】逻辑建模

课程列表对象进行建模。

3-13 【面向对象设计】根据设计范式对【用户对象】逻辑建模

在进行属性定义的时候,要注意要满足数据库的第三设计范式,非主键之间不能够有相互依赖。

3-14 【面向对象设计】根据设计范式对【问答评论对象】逻辑建模

3-15 【面向对象设计】根据设计范式对【课程评价对象】进行逻辑建模

3-16 【面向对象设计】根据设计范式对项目进行逻辑建模-总结

3-17 范式化设计存在的问题

符合范式化的表可以尽可能的减少数据的冗余,也避免的写操作的异常出现脏数据的情况

但是: 数据表中关联表建议不要太多,填表操作会增大数据库的开销。

3-18 反范式化设计

比如课程表和课程章节表,如果在一起是不满足第三范式的,但是为了保证性能上的开销,增加了章节的冗余。

用空间来换取时间 还是挺划算的。

3-19 反范式化设计总结

进行了反3范式设计后现有逻辑模型的优化。为的就是减少关联表的数量, 但是也需要掌握一个度。 避免宽表模式带来的问题。

3-20 物理设计-常用的MySQL存储引擎

MYISAM mysql5.6之前的默认引擎,最常用的非事务性存储引擎

使用堆的数据结果存储,因为不用从索引中读取,  也不用单独维护索引。所以读写效率高。  但是因为读写会锁表, 对频繁读取可能会阻塞。

CSV 以csv格式存储的非事务型存储引擎,甚至可以直接修改文件,来修改某个数据

Archive 只允许查询和新增数据,而不允许修改的非事务存储引擎。

memory 是一种存储在内存中易失性的非事务性存储引擎。

Innodb 最常用的事务型存储引擎。

3-21 物理设计-INNODB存储引擎的特点

事务性存储引擎支持ACID(原子性,一致性,独立性,永久性)。

数据按主键聚集存储。(业务主键可能不适合innodb的主键,一般使用一个自增id列在作为逻辑主键)

支持行级锁及MVCC

支持Btree和自适应的Hash索引

5.6之后支持全文和5.7之后空间索引

3-22 物理设计-跟据Innodb优化项目表结构

给课程表增加自增id

自增ID可以保证数据的物理顺序。表之间的关联也可以使用物理主键关联,来增加效率

3-23 物理设计-跟据Innodb优化项目表结构

给剩下的表都加上了自增id

3-24 物理设计-整数类型的特点

是否有符号: SIGNED UNSIGNED

int(2) :注意: int 括号里面写个2是不会节约数据存储空间的。

TINYINT :1字节

SMALLINT :2字节

MEDIUMINT : 3字节

INT : 4字节

BIGINT : 8字节

3-25 物理设计-实数(小数)类型的特点

FLOAT 4字节 不是精确类型

DOUBLE 8字节 不是精确类型

DECIMAL 每4字节存9个数字,小数点占一个字节。 是精确类型。 存储空间大

123456789.987654321 = decimal(18, 9) 占9字节(小数点占1个字节,整数部分和小数部分各占4个字节), 最多允许存65个数字

3-26 物理设计-实战实数类型的特点

用double类型和decimal类型 sum对比。发现double型求和是不准确的

create  database test;

use test;
create table t(d1 DOUBLE,d2 decimal(10,3));
insert into t values(11.2,11.2),(2.56,2.56),(9.01,9.01),(132.33,132.33);
select  *  from t;
select sum(d1), sum(d2) from t;

3-27 物理设计-时间类型的特点

DATE 3字节 YYYY-MM-DD

TIME 3-6字节 HH:MM:DD[,微秒值] 如果有微秒值,多占1~3个字节。

微秒     存储空间
0        0bytes
1,2     1 bytes
3,4     2 bytes
5,6     3 bytes

举例:
time    15:18:30
time(2)  15:18:29.72
time(4)  15:18:29.7182
time(6)  15:18:29.718216

YEAR 1字节 YYYY (比使用char或者varchar占用的字节更少)

DATETIME 5-8个字节 YYYY-MM-DD HH:MM:SS[.微秒值]

这个占用空间是变动的,原因和TIME类型一个原理

TIMESTAMP 4-7字节 YYYY-MM-DD HH:MM:SS[.微秒值] 相对于DATETIME 存储范围小

3-28 物理设计-实战时间类型的特点

create table t_timestamp(dt TIMESTAMP );
insert into t_timestamp select now();
select * from  t_timestamp;
# TIMESTAMP 类型: 会根据时区不同而值会变化
set  time-zone=‘+10:00’
select  now()
select * from  t_timestamp;

3-29 物理设计-字符串类型的特点

CHAR(M) M = 1-255个字符 固定长度

VarChar(M) 一行中所有varchar类型的列所占用综合最大65535个字节。 其中M=多少个字符

比如  UTF8mb4 的varchar(10) 就占用了 40个字节

TinyText 最大是255个字节

Text 最大是65535个字节

MediumText 最大是16777215个字节(16M)

LongText 最大是4294967295个字节(4g)

Enum 枚举类型, 最大有65535个数目

3-30 物理设计-为列选择适合的数据类型-建议

优先选择符合存储数据需求的最小数据类型。

# 1. 比如使用无符号的int 就可增加一倍的容量

# 2.  将字符串转化为数字
INET_ATON('255.255.255.255' )= 4294967295
INET_NOTA(4294967295) = '255.255.255.255'

3-31 物理设计-为列选择适合的数据类型-建议

谨慎使用ENUM,TEXT 字符串类型

msyql 查询内存映射表,不包括Text类型。  因此在索引时会使用磁盘映射表
Text要使用前缀索引
Text也没有默认值

ENUM本身是一个字符串, 但是使用整数形式存储的。
ENUM优点:因为是整数存储,节约空间和查询效率
ENUM缺点:但是业务中如果需要增加enum的话, 需要alter修改表的结构

和财务相关的数据类型必须使用int或者decimal。

3-32 为课程表选择合适的数据类型

3-33 为章节表选择合适的数据类型

3-34 为用户表选择合适的数据类型

3-35 为项目中的其它表选择合适的数据类型

3-36 数据库对像命名原则一

所有数据库对象名称必须使用小写字母,可选用下划线分割。

所有数据库对象名称禁止使用MySQL保留关键字。

在mysql 的官网上搜索 keywords and  reserved words 查询保留关键字

数据库对象命名要能做到见名识意,并且最好不要超过32个字。

3-37 数据库对像命名原则二

临时库表必须以tmp为前缀, 以日期为后缀。

用于备份的库表必须以bak为前缀,并日期为后缀。

所有存储相同数据的列名和列类型必须一致。

3-38 为项目数据库对像命名

3-39 本章总结

数据库的逻辑设计规范。即3范式。反3范式。

物理设计:常用的存储引擎及其选择方法。

常用的数据类型及其选择方法。

如何为表只要选择合适的存储类型。

为表取一个好名字。

第4章 【众生视角】访问数据库的N种武器和姿势【必要常识】

本章节不仅适用于各语言开发工程师,也适用于:1、关注数据的产品、运营;2、测试工程师;3、运维工程师。提供四类武器,各取所需: 【初级武器】MySQL客户端; 【神兵利器】常用GUI工具; 【高阶神器】MySQL驱动; 【必杀秘器】故障排查。

4-1 使用命令行工具访问MySQL

mysql  -uroot -p

mysql  -uroot  -p  -e "select user()";

4-2 使用SQLyog, navicat访问MySQL

自行安装, 连接即可

mysql连接器: Connector/ODBC, Connector/J

4-3 解锁Python的M3ySQL驱动类库

pip  install  PyMysql

4-4 实战部署Python的MySQL驱动类库

4-5 开发Python操作MySQL数据库

4-6 排查MySQL1045错误解决访问异常

4-7 排查MySQL1153错误解决访问异常

4-8 本章总结

第5章 【极客视角】玩转SQL开发“道”与“术”之道篇【适用于日常工作】

​ 本章品味独特,剑指Geek Style。围绕核心是“工作”,针对日常工作常用的知识。包含工作基本功+工作必备技,两大部分: 【工作基本功】DCL& DDL& DML; 【工作必备技 】常用函数

5-1 【开始起航】初识SQL

什么是SQL :一种描述性的语言。DSL

SQL语言的作用:对存储在RDBMS中的数据进行增删改查的操作。

常用的SQL语言的种类:DCL DDL DML TCL

5-2 【解锁】数据库访问控制语句

DCL : data control language

建立数据库账号:  create user
对用户授权:  grant
收回用户权限: revoke

5-3 【详解】数据库账号创建命令

任务一:建立程序使用的数据库账号。

create  user  mc_class@'192.168.101.%' IDENTFIED WITH  'mysql_native_password' by  '1234567'

#msyql账号是由user和host共同组成的
select  user,host  from  mysql.user;

5-4 【实战】 创建项目数据库账号

#查看帮助
help  create user

create user  mc_test@'192.168.101.%'  IDENTFIED  BY  '1234567' WITH  MAX_USER_CONNECTIONS 1;

show  plugins

5-5 【解锁】 数据库用户授权语句

任务二: 给账户授权。

  1. 常用权限。
#show  privileges;

Insert
Delete
update
Select
Execute

#查看授权帮助。
help  GRANT

5-6 【详解】数据库用户授权命令

GRANT  select(user,host) on mysql.user to  mc_class@'192.168.1.%'

GRANT  select  on  mysql.user to  mc_class@'192.168.1.%';

GRANT  select,insert  on  mysql.* to  mc_class@'192.168.1.%';

5-7 【实战】数据库用户授权语句.

GRANT命令的的注意事项:

  1. 使用GRANT命令授权数据库账户必须存在。

  2. 用户使用GRANT命令授权须具有grant option的权限

    #查看幫助
    \h grant
    

5-8 【工作填坑技能】为数据库用户授权时易犯错误

5-9 【实操】使用Revoke回收数据库用户权限

任务三: 回收用户权限。

help revoke 

#增加权限
grant select,delete,insert,update on  mysql.* to mc_class@'192.168.101.%'

#回收
revoke  delete,insert,update on  mysql.*  from  mc_class@'192.168.101.%'

5-10 【实战必会】 常用的DDL语句-1

DDL: data definition language

建立修改删除数据库: create/alter/drop database

建议修改删除表: create/alter/drop table

建立删除索引: create/drop index

5-11 【实战必会】 常用的DDL语句-2

清空表: truncate table = drop table + create table

重命名表: rename table

建立修改删除视图 : create/alter/drop view

5-12 【实战】 创建项目数据库imc_db

任务一: 建立数据库

help  create  database

#重要参数; 字符集 和 引擎

create database  imc_db

5-13 【解锁】使用create table建立表

任务二: 建立数据库imc_db中的表

help create  table

#重要参数 :  字符集 引擎,  没有设置就使用db上的

5-14 【解锁】使用alter table修改表

任务三: 修改表

help  alter table

alter table  {tablename}  add  ..
alter table  {tablename}  change  ..
alter table  {tablename}  modify  ..
alter table  {tablename}  drop  ..
alter table  {tablename}  raname  ..

5-15 【解锁】使用drop table删除表

任务四: 删除表结构和数据

help  drop table

drop  tablename1, tablename2...

5-16 【解析】建立项目课程表

auto_increment 自增属性

not null 非空属性

default 默认属性

common 备注属性

5-17 【解析】建立项目课程相关表

unsigned 无符号属性

unique key udx_usernick (user_nick) 唯一键属性

Primary key (class_id) 主键属性

5-18 【解析】建立问答相关表

5-19 【实战】 建立项目中的表

5-20 【必知】索引维护语句

任务三: 维护表中的索引

help  create  index

create  [unique] index  index_name  on  tb_name (index_col_name...)


drop  index  index_name  on  tbl_name

5-21 【必会】其它DDL语句的用法

清空表: truncate table imc_note

重命名: rename table imc_note to imc_note2

第6章 【极客视角】玩转SQL开发“道”与“术”之术篇【工作高阶技能】

本章带你玩转SQL开发,学习其实可以很快乐哦。围绕核心是“工作”较为高阶技能和加薪技能,主要是如下两部分: 【工作高阶技】With语句; 【工作加薪技】窗口函数。

6-1 【初识】DML语句

DML : DATA MANIPULATION LANGUAGE

help  insert into 
help  delete
help  update
help  select

6-2 【提升思维】编写Insert语句的思路

任务一: 插入一条数据

编写insert语句的思路

insert哪张表?
哪些字段不能为空?show  create table
确认对应插入列的插入值的清单。


6-3 【开发常用】实战insert语句

insert  into  imc_class(class_name) values ('mysql'), ('redis'), ('mongoDB')
CREATE  UNIQUE  INDEX  uqx_classname on  imc_class(class_name);

insert  into  imc_class(class_name)  values('mysql') on  duplicate key  update add_time = CURRENT_TIME;

6-4 【开发必备】使用select语句查询表中的数据

help  select

#select_expr
select  'hello', 'mysql', '2018+1'

#最好不要使用*
select  * from  imc_db.user

6-5 使用Where子句过滤表中的行

#where 自句
select  name  from  imc_db.user  where name like  '%东%'

编写查询语句的思路:

首先要确定我们过去的数据存在哪些表中: from

其次要确定我们要取哪些列

确认是否需要对表中的数据进行过滤: where

6-6 使用比较运算符过滤数据

like 就是运算符

比较运算符:

 >
 < 
 !=
 = 
 between and
 is null
 is not  null
 like
 not  like    ---  通配符: % 和 _
 in
 not  in

6-7 【实战】MySQL中的比较运算符-1

6-8 【实战】MySQL中的比较运算符-2

6-9 【面试常问】使用逻辑运算符关联多个过滤条件

逻辑运算符:

and  ,  && 
or,   ||
xor :  异或, 两边要一真一假,  才为真

6-10 【实战】MySQL逻辑运算符-1

6-11 【实战】 MySQL逻辑运算符-2

6-12 【解锁】从多个表中查询数据

表与表之间要存在一定的关联关系

join:

inner  join
outer  join : 
              left  join
              rigit join

6-13 【实战】使用内关联查询多个表中的数据

6-14 【解锁】外联接查询

6-15 【实战】 外关联查询

6-16 使用Group by 分组查询结果

group by … having

6-17 【实战】分组统计查询

show  variables  like 'sql_mode'

6-18 使用having子句过滤分组结果

6-19 MySQL中的分组函数-1

常用的聚合函数:

count(*)  / count(col)
count(distinct  user_id)
sum(col)
avg(col)
max(col)
min(col)

6-20 MySQL中的分组函数-2

6-21 MySQL中的分组函数-3

6-22 使用order by子句排序查询结果

6-23 使用Limit子句限制返回的行数

6-24 【解锁】使用Create View语句创建视图

help  create  view  {viewname}  as

6-25 【初识】数据删除语句 Delete

delete  a
from imc_type a
join (
        select  type_name, min(type_id) as  min_type_id, count(*)
        from imc_type
        group by type_name having count(*) > 1
     ) b on a.type_name = b.type_name and a.type_id > min_type_id;
#展示警告信息
show  warnings;

6-26 【实战】使用Delete语句删除数据

6-27 【初识】 数据更新语句Update

6-28 【实战】使用Update语句修改数据

6-29 使用SQL获取数据库时间

系统函数:

#时间函数
select  CURDATE() , CURTIME(),NOW()
#格式化时间   DATE_FORMAT(date, fmt)   %Y %M %d  %H %i  %s
select  DATE_FORMAT(NOW(), '%Y:%M')
#时间戳转换:  
sec_to_time(second)
time_to_sec(time)
#相差的天数
DATEDIFF(NOW(), '1970')
#计算
date_add(now(), interval 1 day)
#截取
extract(year from  now());

#其他
UNIX_TIMESTAMP()
FROM_UNIXTIME()

6-30 使用SQL转换时间数据

6-31 使用SQL进行时间计算

6-32 使用SQL提取部分时间值

6-33 使用SQL拼接字符串

#常用的字符串函数

#连接
CONCAT(str1, str2...)
CONCAT_WS(sep, str1, str2... )

#长度
char_length 
length

FORMAT(123456.789, 4)

6-34 使用SQL判断字符串的长度

6-35 使用SQL截取字符串’

6-36 使用SQL按分隔符处理数据

6-37 MySQL()中的其它常用函数

#四捨五入
round(x,d)

#随机数
rand()

#case when
case when  [cond]
then result
[when [cond] then result ..]
[ELSE result]
END

#MD5值
MD5()

6-38 【解锁】MySQL8.0新增的公共表表达式

在可读性和性能上都优于子查询

mysql8.0之后的版本才可以使用。

CTE生成一个命名临时表,并且只在查询期间有效。

CTE临时表在一个查询中可以多次引用及自引用。

6-39 【实战】 公共表表达式-1

6-40 【实战】 公共表表达式-2

6-41 【解锁】MySQL8.0新增的窗口函数

6-42 【实战】 窗口函数-1

6-43 【实战】 窗口函数-2

6-44 【实战】 窗口函数-3

6-45 【警惕】SQL开发中易犯的错误-1

错误1: 使用count(*)判断是否存在符合条件的数据。很耗性能

代替: 使用select … limit 1

错误2: 在执行一个更新语句后,使用查询方式判断此更新语句是否执行成功。

代替: 使用ROW_COUNT() 函数判断修改行数

错误3: 试图在ON条件中过滤不满足条件的记录。

SELECT from  imc_class a  join  imc_course b 
on  b.class_id = a.class_id  and  a.class_id = 5

代替:

SELECT from  imc_class a  join  imc_course b 
on  b.class_id = a.class_id  where  a.class_id = 5

6-46 【警惕】 SQL开发中易犯的错误-2

错误4: 在使用IN进行子查询判断时,在列中为指定正确的表名。

#这样的查询会查出A表中所有的数据。
SELECT  A1 FROM  A where A1 IN (SELECT  A1 from B)

代替1:

SELECT  A1 FROM  A where A1 IN (SELECT  B.A1 from B)

代替2:

使用join

6-47 章节总结;

如何使用DC l语句来管理数据库的访问

如何使用DDL语句来建立数据库对象。

如何使用DML语句来操作数据库中的数据

常用的系统函数。

开发中易犯的错误。

第7章 【专家视角】 揭开SQL优化神秘面纱【适用于升职加薪】

武以快为尊。同理,快速高效工作,同样的工作时长,却创造更多企业价值,凸显个人价值,才能立于不败之地。 本章将从专家的视角,为你揭开SQL优化神秘面纱,解锁SQL优化的升职加薪技能。让你在工作中比别人技高一筹,助你在工作中对SQL优化,慢查询优化能有独到的企业级解决方案,为你的高薪保驾护航。

7-1 优化sql的一般步骤:

首先要有良好的数据结构设计
发现问题
分析执行计划
优化索引
改写sql
数据库水平,垂直拆分。  搭建集群

7-2 发现sql慢的渠道:

  1. 用户主动上报应用性能问题

  2. 分析慢查询日志发现存在问题的sql

show  variables  like 'long_query_time';
show  variables  like  'slow_query_log';
show  variables  like  'slow_query_log_file';
show  variables  like  'log_queries_not_using_indexes';


#mysql默认不会启动慢查询
set global slow_query_log = [ON|OFF]
set global slow_query_log_file = /sql_log/slowl.log
set global long_query_time = xx.xxx  (秒)
set global log_queries_not_using_indexes = [ON|OFF]
#官方工具:  mqsqldumpslow  [OPTS...] [LOGS...]
  
mysqldumpslow  /sql_log/slowl.log

#其他工具: pt-query-digest [OPTIONS] [FILES] [DSN]
  
pt-query-digest  /sql_log/slowl.log
  1. 数据库实时监控

    通过慢查询日志的方式缺点:不能都实时监控,需要一定的周期

​ 有个监控长时间运行的sql:

select id, user, host, DB, command, time, state, info from information_schema.PROCESSLIST where TIME>60

7-3 分析执行计划:

EXPLAIN作用:

1. 了解sql如何访问表中的数据。
2. 了解sql如果使用表中的索引。
3. 所使用的查询类型。

结果分析:

  1. id的值代表执行顺序: 由大到小执行

  2. select_type:

    SIMPLE:  不包含子查询或者UNION操作的查询
    PRIMATY: 查询中如果包含子查询,那么最外层的查询则被标记为PRIMARY
    SUBQUERY:  SELECT列表中的子查询
    DEPENDENT SUBQUERY: 依赖外部结果的子查询
    UNION:    union操作的第二个或是之后的查询的值为union
    
  3. table:

    输出的表的名称或者别名
    
    
    
  4. partitions 分区表id

    对于分区表, 显示查询的分区ID
    对于非分区表, 显示NULL
    
  5. type 连接类型:

    NULL    ---- 很少见
    system     这个是const连接类型的一个特例, 当查询的表只有一行时使用
    const      
    eq_ref
    ref
    ref_or_null
    index_merge
    range
    index
    ALL
    
    性能从高到底
    
  6. possible_key : 查询中可能会遇到的索引;

    key :实际使用到的索引

    key_len: 使用索引的最大长度。(所以在定义表结构时要最短的长度, 因为会影响到执行计划)

  7. ref: 指出哪些列或常量被用于索引的查找

  8. row: 根据统计信息预估的扫描的行数, (如果是关联查询次数 就是每张表的row值乘积)

  9. filtered: 预估扫描行数中命中结果的百分比

  10. Extra:

    Distinct:    优化distinct操作。 在找到第一匹配的元组后就停止查找
    Not exitst:  使用了not exitst优化
    using  index :  使用了覆盖索引(直接读取的索引,没有访问数据资源)优化
    
    

第8章 【专家视角】SQL的索引优化之向面试开炮&吊打面试官

本章针对面试中高频考点:索引优化进行讲解,让你面试无忧,直接向面试开炮,甚至吊打面试官

sql优化的手段:
1. 优化索引
2. 改写sql达到更好的利用sql

mysql的索引是在存储引擎这一层来实现的,而不是在服务层实现的,所以不同的引擎对应的索引的工作方式可能是不同的:

Innodb支持的索引类型:
  Btree索引
  自适应HASH
  全文索引
  空间索引
Btree索引特点: 平衡二叉树
  1. 适用于全值匹配的查询 : class = ‘mysql’ 或者 class in(‘mysql’, ‘postSql’)

  2. 适用于范围查找between > <

  3. Btree 索引从索引的最左侧列开始匹配查询

    基于Btree索引的特点可能不会命中索引的场景:

    1.  比如 create index idx_title_studyCnt on imc_course(title, study_cnt)
    
    #使用索引的顺序不可以乱
    study_cnt > 300 (不能使用到索引)
    title = 'Mysql' (可以)
    title = 'Mysql' and study_cnt > 300(可以)
    study_cnt > 300 and title = 'Mysql' (也是可以的,mysql做了一定的优化)
    
    
    2.   create index idx_a_b_c on imc_test(a,b,c)
    #不能跳过索引
    a = 1 and c=2 (只会命中a)
    
    3. NOT IN  和 <> 操作无法使用索引
       
    4. 索引列上不能使用表达式或者函数
    
在哪些列上建立索引:
  1. where 子句中的列(注意只需要建立在筛选性低的列上)

  2. 包含在order by group by distinct中的列,提高排序性能:

    1. 索引列的顺序和orderby的顺序要一致
    2. 索引列的升序和降序也要和orderby一致
    3. 在关联查询时候orderby的字段要全部在关联查询的第一张表中
    
  3. 多表JOIN的关联列

最终的目的:
  每个执行计划中:
  type: 都要使用到索引
  row:     扫描的行数降到最低
  filtered:   预估扫描行数中命中结果的百分比越高越好
选择复合索引键的顺序:
  1.  区分度最高的列放在联合索引的最左侧
  2.  最频繁使用的列放在最左侧
  3.  尽量把字段的长度小的列放在联合索引列的最左侧
索引使用的误区:
  1. 索引越多越好?

    1.  增加写入维护开销
    2.  如果遇到很多索引都可以使用,会增加mysql查询优化器生成执行计划的计算时间
    
  2. 使用IN列表查询不能用到索引?

      其实是可以全值匹配,使用到索引的
    
  3. 查询过滤顺序必须同索引键的顺序相同才可以使用到索引?

    mysql查询优化器可以自动调整顺序
    
SQL改写的原则
1. 使用left join  where  filed is null 代替  not in
select  class_name  
from  imc_class
where class_id not in  (select class_id  from  imc_course);



select  class_name
from imc_class a 
left join  imc_course b on a.class_ia = b.class_id
where b.class_id is null
  1. 使用CTE代替子查询

  2. 拆分复杂的大sql为多个简单的小sql

  3. 巧用计算列优化查询

    select  *  from  imc_classvalue where (content_count+level_count+view_cnt) > 28;
    
    #mysql5.7之后可以增加计算列
    alter table imc_test  add column total int(10)  as (content_count+level_count+view_cnt)
    
    
    create index idx_total on imc_test(total)
    

第9章 【架构师视角】搞定数据库并发高压,服务器永不宕机【可用于彰显你的眼界&格局】

事务和并发控制

什么是事务

事务是数据库执行操作的最小逻辑单元

可以有一个sql或多个sql组成

组成事务的sql要满足原子性

事务的acid特性

原子性
一致性
隔离性(并发控制)
持久性

并发带来的问题

  脏读:  事务a读取到了事务b未提交的数据。事务b最后又回滚了。
  
  不可重复读:  事务a第二次读时,事务b提交了修改。导致事务a前后读取的统一数据不一致
  
  幻读:   它是不可重复读一个变种,事务a前后两个读的数据总数不一致。 事务a第二次读时,事务b插入了一条新数据

innodb的隔离级别

顺序读(SETIALIZABLE)
可重复读(Repa)
读已提交
读未提交

设置隔离级别:

help  set 
 
set  SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
show variables like '%iso%'

阻塞的原因:

共享锁:

排他锁:

事务上使用了排它锁

查看连接ID:

  select CONNECTION_ID()
如何处理阻塞:
  kill 连接
  优化sql占用资源事务的sql,使其尽快释放资源

如何发现死锁:

  set global innodb_print_all_deadlocks=on;

如何处理死锁:

1.  其实mysql会自行回滚占用资源少的事务
2.  并发的事务按照相同的顺序占有资源

第10章 【青春不散场】课程总结,彰显重点【知识梳理,重塑知识栈】

​ 本章进行课程所有内容的梳理,总结回顾。提炼精华,再现经典。帮助同学们快速梳理,巩固升华,达到融会贯通,学以致用到工作所需中

10-1 课程回顾及展望

10-2 课程回顾及展望-续

你可能感兴趣的:(数据库,mysql)