• MySQL学习笔记——By Bug

       

      文档说明

      笔记开始日期:2023年12月1日 笔记最新更新日期:2024年1月25日 笔记更新状态:MySQL基础和MySQL进阶已完结,MySQL运维待日后择期更新。

      你好:

      首先感谢你使用这份笔记手册,一起学习,一起进步,本学习笔记是我在自学过程(网课视频在下方链接)中的随手笔记,可能出现遗漏,顺序错误或语法,单词等错误,你可以在自己的学习过程中对这份笔记更正即可。

      学习参考网课资料资料:https://www.bilibili.com/video/BV1Kr4y1i7ru/ 相关资料可在黑马程序员官网或视频下方评论区下载

      本笔记文档所用到的软件 MySQL版本:8.0.35 MySQL Community server-GPL 可视化开发工具:DataGrip-2023.3.2 MySQL官方说明文档:MySQL :: MySQL Documentation

      由于图片路径问题,笔记中的图片可能出现无法正常显示得到问题,请谅解。

      说明到此结束下面是正文内容 :


      MySQL准备

      windows安装MySQL

      待补充

       

       

      Linux系统安装MySQL(生产环境)

      1. 准备一台Linux服务器

      云服务器或者虚拟机都可以;

      Linux的版本为 CentOS7;

      虚拟机安装linux系统方法可自行搜索。

       

      2. 下载Linux版MySQL安装包

      https://downloads.mysql.com/archives/community/

      image-20211031230239760

      3. 上传MySQL安装包

      image-20211031231930205

       

      4. 创建目录,并解压

       

      5. 安装mysql的安装包

       

      6. 启动MySQL服务

       

      7. 查询自动生成的root用户密码

      命令行执行指令 :

      然后输入上述查询到的自动生成的密码, 完成登录 .

       

      8. 修改root用户密码

      登录到MySQL之后,需要将自动生成的不便记忆的密码修改了,修改成自己熟悉的便于记忆的密码。

      执行上述的SQL会报错,原因是因为设置的密码太简单,密码复杂度不够。我们可以设置密码的复杂度为简单类型,密码长度为4。

      降低密码的校验规则之后,再次执行上述修改密码的指令。

       

      9. 创建用户

      默认的root用户只能当前节点localhost访问,是无法远程访问的,我们还需要创建一个root账户,用户远程访问

       

      10. 并给root用户分配权限

       

      11. 重新连接MySQL

      然后输入密码

       

      12. 通过DataGrip远程连接MySQL

       

       

       

      MYSQL下载与安装

      MySQL官网


       

      SQL图形化工具下载

      下载

      专业版收费,社区版免费

      DataGrip

      DBeaver Community

       

      安装

      如需安装激活,请自行百度激活码和激活工具


       

      MySQL基础

      SQL注释语法

      单行注释:--注释内容或#注释内容

      多行注释:/注释内容/


       

      SQL分类

      1. DDL

      2. DMI

      3. DQL

      4. DCL


      MySQL数据库启动与停止

      方法1: WIN+R打开运行,输入services.msc,找到MySQL80,选择启动或停止

      方法2: 打开命令行(cmd),输入下面的指令 启动:net start mysql80 停止:net stop mysql80


      MySQL客户端连接

      方法1:使用MySQL提供的客户端命令行工具 image-20240110102605325

      方法2:使用windows的命令行工具连接 打开CMD控制台:输入mysql [-h 127.0.0.1] [-p 3306] -u root -p

      [-h 127.0.0.1] [-p 3306]可以省略


      数据模型

      关系型数据库(RDBMS): 概念:建立在关系模型基础上的,由多张相互连接的二维表组成的数据库;

      特点:

      1. 使用表存储数据,格式统一,便于维护。

      2. 使用SQL语言操作,标准统一,使用方便。


      DDL数据库操作

      查询

      查询所有数据库:

      查询当前数据库:

      创建
      删除
      使用

       

      DLL表操作

      创建

      例如:创建一个员工信息表

      添加修改删除

      添加字段

      修改数据类型

      修改字段名和字段类型

      案例:

      删除字段:

      案例:删除emp中的username

      修改表名:

      案例:

      删除表:

       

      数据类型

      数值类型:

      类型大小范围(有符号)范围(无符号)用途
      TINYINT1 Bytes(-128,127)(0,255)小整数值
      SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
      MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
      INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
      BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
      FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
      DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
      DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

       

      字符串类型:

      类型大小用途
      CHAR0-255 bytes定长字符串
      VARCHAR0-65535 bytes变长字符串
      TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
      TINYTEXT0-255 bytes短文本字符串
      BLOB0-65 535 bytes二进制形式的长文本数据
      TEXT0-65 535 bytes长文本数据
      MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
      MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
      LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
      LONGTEXT0-4 294 967 295 bytes极大文本数据

      日期类型:

      类型大小 ( bytes)范围格式用途
      DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
      TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
      YEAR11901/2155YYYY年份值
      DATETIME8'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'YYYY-MM-DD hh:mm:ss混合日期和时间值
      TIMESTAMP4'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳

       


       

      DML操作(操作数据)

      查询

       

      添加数据

      1. 给指定字段添加数据

      2. 给全部字段添加数据

      3. 批量添加数据

       

      修改数据

       

      删除数据


       

      DQL-操作(数据查询语言)

       

      DQL语法

       

      基本查询

       

      条件查询

      基本语法:

      条件:

      比较运算符功能
      >大于
      >=大于等于
      <小于
      <=小于等于
      =等于
      <>或!=不等于
      between...and...在某个范围内(包含最小值和最大值)
      in(...)在in之后的列表中的值,多选1
      like 占位符模糊匹配(_匹配单个字符,%匹配任意个字符)
      is null是null
      逻辑运算符功能
      and或&&并且(多个条件同时成立)
      or或||或者(多个条件任意一个成立)
      not或!非,不是

       

       

      聚合函数

      常见的聚合函数

      函数功能
      count统计数量
      max最大值
      min最小值
      avg平均值
      sum求和

       

      分组查询

      语法:

      where 和 having 的区别

       

      排序查询

      基本语法

      排序方式

       

      分页查询

      注意:

      1. 起始索引是从0开始的,起始索引=(页码-1)*每页显示记录数

      2. 分页查询时数据库的方言,不同数据库有不同的语法,MySQL是limit

      3. 如果查询的是第一页的数据,起始索引可以省略,直接写limit 10;

       

      DQL执行顺序

      from→where→group by→select→order by→limit

      DQL语法练习案例

       

      DCL-管理用户

      1. 查询用户

      1. 创建用户

      1. 修改用户密码

      1. 删除用户

       

      函数

      字符串函数 (常用)

      函数功能
      concat(s1,s2,......,sn)字符串拼接,把s1,s2,......,sn拼接成字符串
      lower(str)把字符串str全部转换为小写
      upper(str)把字符串str全部转换为大写
      lpad(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到N个字符串长度
      rpad(str,n,pad)右填充,用字符串pad对str的右边进行填充,达到N个字符串长度
      trim(str)去掉字符串头部和尾部的空格
      substring(str,start,len)返回从字符串str位置起的len个长度的字符串

      使用语法:

      数值函数

      函数功能
      ceil(x)向上取整
      floor(x)向下取整
      mod(x,y)返回x/y模(取余数)
      rand()返回0-1内的随机数
      round(x,y)求参数x的四舍五入的值,保留Y位小数

       

      日期函数

      函数功能
      curdate()返回当前日期
      curtime()返回当前时间
      now()返回当前时间和日期
      year(date)返回date的年份
      month(date)返回date的月份
      day(date)返回date的日期
      date_add(date,interval expr type)返回一个日期/时间值加上一个时间间隔后的时间值
      datediff(date1,date2)返回起始时间date1和终止时间date2之间的天数(date1-date2)

      案例

      流程函数

      函数功能
      if(value,t,f)如果值为value返回t否则返回f
      ifnull(value1,value2)如果value1不为空返回value1,狗则返回value2
      case when [val1] then [res1] ...else [default] end如果val1为true,返回res1,...否则返回default默认值
      case [expr] when [val1] then [res1] ...[else] [default] end如果expr的值等于val1,返回res1,...否则返回default默认值

       

      案例

      学生成绩表

      idnamemathchineseenglish
      2101张三219955
      2102李四607443
      2103王五873498
      2104赵六503365

       

      约束

      概念

      一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。MySQL数据库通过约束(constraints)防止无效的数据进入到表中,以保护数据的实体完整性。

      约束分类

      约束描述关键字
      非空约束限制该字段的数据不能为空not null
      唯一约束保证该字段的所有数据都是唯一的,不重复的unique
      主键约束主键是一行数据的唯一标识,非空且唯一primary key
      默认约束保存数据时,如果未指定该字段的值,则采用默认值default key
      检查约束保证字段满足某一条件check
      外键约束让两张表的数据时间建立连接,保证数据一致性和完整性foreign key

      案例

      根据下面的条件创建一张表

      字段名字段含义字段类型约束条件约束关键字
      idid唯一标识int主键,自动增长primary key,auto_increment
      name姓名varchar(10)不为空且唯一not null,unique
      age年龄int大于0,小于120check
      status状态char(1)若没有该值,默认为1default
      genner性别char(1) 

       

      外键约束

      外键相关语法

      添加外键

      删除外键

       

      外键删除/更新行为

      行为说明
      no action当父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。
      restrict当父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。
      cascade当父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录
      set null当父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键的值为Null
      set default父表有变更时,子表将外键设置成一个默认的值(innodb不支持)。

      语法

       

      表1:员工表(a1)(子表)

      namebumen_id
      name14
      name23
      name32
      name41
      name55

      表2:部门表(a2)(父表)

      idbumen
      1后勤部门
      2设计部门
      3策划部门
      4营销部门
      5管理部门

       

      多表查询

      多表关系

      一对多(多对一),多对多,一对一。

      多表查询概述

      1.概述:从多张表中查询数据。

      2.笛卡尔积:AB两个集合的所有组合情况。(在多表查询中,需要消除无效的笛卡尔积) 如何消除笛卡尔积:

      学生表(users)

      idnameageclass_choosegenner
      1张三121
      2李四121
      3王五122
      4赵六122

      课程编号表(class)

      class_idclass_name
      1语文
      2数学

       

      3.分类:

      连接查询 内连接:相当于查询A、B交集部分数据。

      外连接:

      左外连接,查询左表所有数据,以及两张表交集部分数据。

      右外连接,查询右表所有数据,以及两张表交集部分数据。

      自连接:当前表与自身的连接查询,自连接必须使用表别名。

       

      内连接

      隐式内连接

      显式内连接

       

      外连接

      左外连接

      右外连接

      案例

       

      自连接

      自连接查询语法

      自连接查询可以是内连接查询,也可以是外连接查询。

      查询员工及其所属领导的姓名

       

      子查询

      概念:在SQL语句中嵌套select语句。

      语法

      子查询中,外部语句可以是增(insert)删(delete)改(update)查(select)的任何一个;

      子查询类型 标量子查询(子查询结果为单个值) 列子查询(子查询结果为一列) 行子查询(子查询结果为一行) 表子查询(子查询结果为多行多列)

      标量子查询

      常用操作符:= ,<> ,> ,< ,>= ,<=

      列子查询

      常用操作符:in , not in , any , some ,all

      操作符描述
      in在指定的集合内,多选1
      not in不在指定的集合范围内
      any子查询返回的列表中,有任意一个满足即可
      some与any等同,使用some的地方都可以使用any
      all子查询返回列表中的所有这些值必须都满足

       

      行子查询

      常用操作符:=,<>,in,not in

       

      表子查询

      常用操作符:in

       

       

      联合查询

      联合查询注意事项:! 多张表列数必须相同,字段数据类型也必须相同

      union all -- 直接将两次结果合并,union -- 将两次结果去重后再进行合并

       

       

      案例

      根据需求,编写SQL语句

      1. 查询员工的姓名、年龄、职位、部门信息。

      2. 查询年龄小于30岁的员工姓名、年龄、职位、部门信息。

      3. 查询拥有员工的部门ID、部门名称。

      4. 查询所有年龄大于40岁的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示出来。

      5. 查询所有员工的工资等级。

      6. 查询“研发部”所有员工的信息及工资等级。

      7. 查询“研发部”员工的平均工资。

      8. 查询工资比“灭绝”高的员工信息。

      9. 查询比平均薪资高的员工信息。

      10. 查询低于本部门平均工资的员工信息。

      11. 查询所有的部门信息,并统计部门的员工人数。

      12. 查询所有学生的选课情况,展示出学生名称,学号,课程名称

      员工表(emp)

      nameagemoneyworkwkbm_id
      张三337000经理1
      李莉233000销售5
      李斯344000销售5
      王刚245000研发2
      刘畅362000设计3
      王丽丽373970设计3
      黄旭283330生产4
      吴凡范264350生产4
      蔡徐坤435700生产4

      部门表(work_ids)

      idsbumem
      1财管部
      2研发部
      3设计部
      4生产部
      5销售部
      6公关部

      工资等级表(salgarde)

      gradelosalhisal
      101000
      210012000
      320013000
      430014000
      540015000
      650016000
      760017000
      870018000

       


       

      事务

      事务简介

      事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

      事务操作

      表名:account

      idnamemoney
      1张三2000
      2李四2000

      完成张三为李四转账的操作:

       

      事务的四大特性|ACID(⭐)


      并发事务问题

      问题描述
      脏读一个事务读到另外一个事务还没有提交的数据。
      不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
      幻读一个事务按条件查询数据时,没有对应的数据行,但在插入数据时,又发现这行数据已经存在了,好像出现了’幻影‘。

      不可重复读

      image-20240111121614158

      事务A第一步查询后,事务B将数据进行了修改,此时事务A第三步再次查询时,与第一步查询得到的数据不同!称之为不可重复读。


      事务隔离级别

      不同隔离级别下,会出现的并发事务问题

      隔离级别脏读不可重复读幻读
      read uncommitted(读未提交)
      read committed(读已提交)×
      repeatable read(默认)(可重复读)××
      serializable(串行化)×××

      注意:!表中,事务隔离级别从上到下依次升高,事务隔离级别越高,数据安全性越高,但性能越低。

       

      查看和设置事务隔离级别

      serializable(串行化):在并发事务操作时,只允许一个事务执行。

      总结

      学习过程

      指针1
      指针2
      指针3
      指针4
      指针5
      指针1丨KEY丨指针2丨KEY丨指针3丨KEY丨指针4丨KEY丨指针5
      子节点1
      子节点2
      子节点3
      子节点4
      子节点5

      MySQL进阶

      存储引擎

      MySQL体系结构

      指针1
      指针2
      指针3
      指针4
      指针5
      指针1丨KEY丨指针2丨KEY丨指针3丨KEY丨指针4丨KEY丨指针5
      子节点1
      子节点2
      子节点3
      子节点4
      子节点5

      20200811182607498

       


      存储引擎简介

      存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于数据库的表的,而不是基于数据库的,所以存储引擎也被称为表类型。

      在创建表时,指定存储引擎的方式:

      查询当前数据库支持的存储引擎


      存储引擎特点

      Innodb引擎

      介绍:

      Innodb引擎是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5以后,Innodb是MySQL的默认存储引擎

      特点:

      文件:

      XXX.ibd:xxx为表名,Innodb引擎的每张表都会对应这样一个表空间文件,存储该表的结构(frm,sdi)、数据、索引

      参数:Innodb_file_per_table

       

      逻辑存储结构

      指针1
      指针2
      指针3
      指针4
      指针5
      指针1丨KEY丨指针2丨KEY丨指针3丨KEY丨指针4丨KEY丨指针5
      子节点1
      子节点2
      子节点3
      子节点4
      子节点5

      MyISAM引擎

      介绍:

      MyISAM引擎是MySQL早期的默认存储引擎。

      特点:

      文件:

       

      Memory引擎

      介绍:

      Memory引擎的表数据存储在内存中,由于受到硬件或断电的影响,只能将这些表作为临时表或缓存来使用。

      特点:

      文件:

      xxx.sdi:存储表结构信息

       

      三种引擎不同维度区别(⭐)

      特点innodbmyisammemory
      存储限制64TB
      事务安全支持--
      锁机制行锁表锁表锁
      B+tree索引支持支持支持
      Hash索引--支持
      全文索引支持(5.6版本之后)支持-
      空间使用N/A
      内存使用中等
      批量插入速度
      支持外键支持--

      存储引擎选择

      存储引擎没有好坏之分,在选择存储引擎时,应根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。


      索引

      索引概述

      索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就叫索引

      在无索引时,通过全表扫描进行查询,效率极低

      在有索引时,通过对应的数据结构进行查询,更加高效。

      索引的优缺点:

      1. 提高数据检索的效率,降低数据库的IO成本

      2. 通过索引列对数据进行排序,降低数据排序成本,降低CPU消耗。

      1. 索引列也要占用空间

      2. 索引大大提高了查询效率,同时也降低了更新表的速度,如对表进行insert,update,delete时,效率降低。

       

      索引结构

      MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

      索引结构描述
      B+tree索引最常见的索引类型,大部分引擎都支持B+tree索引
      hash索引底层数据结构是用哈希表实现的,只有精确匹配索引的查询才有效,不支持范围查询。
      r-tree(空间索引)空间索引是Myisam引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。
      full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式,类似于Lucene,solr,es

      不同索引结构在不同存储引擎中的支持情况

      索引INNODBmyisammemory
      B+TreeYESYESYES
      HashNONOYES
      R-TreeNOYESNO
      Full-text5.6版本后支持YESNO

      以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储四个KEY,5个指针):

      指针1
      指针2
      指针3
      指针4
      指针5
      指针1丨KEY丨指针2丨KEY丨指针3丨KEY丨指针4丨KEY丨指针5
      子节点1
      子节点2
      子节点3
      子节点4
      子节点5

      image-20240113172533952

      当key数量大于4时,中间元素向上分裂。

      B-tree数据结构可视化网站:https://www.cs.usfca.edu/~galles/visualization/BTree.html

      树的度数:一个节点最多子节点个数。

       

      以一颗最大度数为4的B+tree为例:

      image-20240113172241370

      B+tree与 B-tree不同的是:

      1. 所有元素数据都会出现在叶子节点,非叶子节点起索引作用

      2. 所有叶子节点之间形成单向链表

      B+tree图形化页面:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

       

      mysql索引数据结构对经典的B+Tree进行了优化。在原B+Tree基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高了区间访问的性能。

      image-20240113173142766

      如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突,也称hash碰撞,可以通过链表来解决。

       

      hash索引的特点

      1. hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,......)

      2. 无法利用索引完成排序操作。

      3. 查询效率高,通常只需要一次检索就可以,效率通常高于B+tree索引。

      hash在存储引擎支持情况

      在MySQL中,支持hash索引的是memory引擎,而innodb中具有自适应hash功能,hash索引是存储引擎根据B+tree索引在指定条件下自动构建的。

      为什么innodb选择B+tree

      1. 相对于二叉树,层级更少,搜索效率更高。

      2. 对于B+tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。

      3. 相对Hash索引,B+tree支持范围匹配及排序操作。


      索引分类

      分类含义特点关键字
      主键索引针对于表主键创建的索引默认自动创建,只能有一个primary
      唯一索引避免同一个表中某列数据中的值重复可以有多个unique
      常规索引快速定位特定数据可以有多个 
      全文索引全文索引查找的是文本中的关键字,而不是比较索引的值可以有多个fulltext

       

      在innodb存储引擎中,根据索引储存的形式,又可以分为以下两种 :

      分类含义特点
      聚集索引(clustered index)将数据与索引存储到一起,索引结构的叶子节点保存了行数据。必须有,且只有一个
      二级索引(secondary index)将数据与索引分开存储,索引结构的叶子节点关联对应的主键。可以存多个

      聚集索引选取规则:

      1. 如果存在主键,逐渐就是聚集索引。

      2. 如果不存在主键,将使用第一个唯一索引作为聚集索引。

      3. 如果表没有主键,或没有合适的唯一索引,则innodb会自动生成一个rowid作为隐藏的聚集索引。

       

      聚集索引叶子节点挂的是这个索引对应的一行的数据

      二级索引挂的是这一行对应的id数据,而非全部数据。

      image-20240114185926570


      索引语法


      SQL性能分析

      查看和分析SQL性能的四种方式:

      慢查询日记录了所有执行时间超过指定参数(long_query_time,单位:s,默认10s)的所有SQL语句的日志,MySQL的慢查询日志默认是没有开启的,需要在MySQL配置文件/etc/my.cnf中配置如下信息。

      方法:

      1. 打开linux控制台,修改文件:vi /etc/my.cnf

      2. 插入:show_query_log = 1和long_query_time=2

      3. 在/var/lib/mysql目录下可以看到localhost-slow.log

      4. 查看日志:cat localhost-slow.log

       

      使用 show profile 能够在做SQL优化时帮助我们了解时间都耗费在了哪里,通过have_profiling参数,能看到当前mysql是否支持。

      profile操作:

      profiling默认是关闭状态,可以通过set语句在session/global级别开启profiling

      执行一系列SQL操作,然后通过下面的指令查看指令的耗时情况。

       

      explain或者desc指令获取MySQL如何执行select语句信息,包括selectTV据执行过程中表如何连接和连接顺序。

       

      explain执行计划各字段的含义:

      1. id select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,id值越大,越先执行。)

      2. select_type 表示select类型,常见的取值有simple(简单表,即不是用表连接或子链接)、primary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)、subquery(select/where之后包含了子查询)等。

      3. type ⭐ 表示连接类型,性能由好到差连接类型为NULL、system,const、eq_ref、ref、range、index、all 使用唯一性索引时,会出现const,使用非唯一性索引时,会出现ref。

      4. possible_key ⭐

        显示可能应用在这张表上的索引,一个或多个。

      5. key ⭐

        实际使用的索引,如果为Null,则没有使用索引。

      6. key_len ⭐ 表示使用到的索引的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。

      7. rows MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。

      8. filtered 表示返回结果的行数占所需读取行数的百分比,filltered值越大越好,性能越高。

      9. extra 展示前面没有展示出来的信息。


      索引使用

      使用规则

      sql提示:

      SQL提示,是优化数据库的重要手段,简单来说,就是在SQL语法中加入一些人为的提示来达到优化操作的目的。

      语法:

      extra中显示的信息的含义 user index condition:查找使用索引,但需要回表查询数据。

      user where,using index:查找使用了索引,但是需要的诗句在索引列中能够找到,所以不需要回表查询。


      索引设计原则

      1. 针对于数据量较大,且查询比较频繁的表建立索引。

      2. 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。

      3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

      4. 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。

      5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

      6. 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

      7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

       


       

      SQL优化

      插入数据

      主键优化

       

      order by 优化

      1. using filesort:通过全表扫描或表的索引,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫filesort排序。

      2. using index:通过有序索引顺序扫描直接返回有序数据,这种情况为using index,不需要额外排序,效率较高

      此时,就需要针对这些字段单独创建索引

      注意:

      1. 根据排序字段建立合适的索引。

      2. 尽量使用覆盖索引。

      3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(asc/desc)。

      4. 如果不可避免的出现filesort,大数据量排序是,可以适当增加排序缓冲区(sort_buffer_size)大小。(默认为256K)

         

      group by 优化

      1. 在进行分组操作时,可以通过建立索引提高效率。

      2. 在分子操作时,索引的使用也是满足最左前缀法则。

       

      limit 优化

      一个常见的问题,当limit 2000000,10时,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录则被丢弃了,查询排序的代价非常大。 优化思路: 一般分页查询时,可以通过创建覆盖索引能够比较好的提高性能,可以通过覆盖索引加子查询的形式进行优化。

       

      count 优化

      当获取大量数据的总行数时:

      myisam引擎把一个表的总行数存在了磁盘上,在执行count(*)时,直接返回这个数,效率高。 innodb引擎在执行count(*)时,需要一行行从引擎中读出来,在累计计数,效率较低。

      优化思路:自己计数;

      暂无较好的优化方式。

      几种count方式的特点:

      1. count(主键)

        InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)。

      2. count(字段)

        没有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

        有not null约束:InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。

      3. count(1)

        InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。

      4. count(*)

        InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

      执行效率:

      count(*)≈count(1)>count(主键id)>count(字段)

       

      update 优化

      update语句注意事项:

      1. 在使用update时,尽量使用带索引的字段作为条件,不带索引的尽量创建索引。

      2. innodb的行锁是针对索引加的锁,不是针对记录加的锁,并且索引不能失效,否则行锁会升级为表锁,并发性能降低。


      视图&存储过程&触发器

      视图

      什么是视图? 视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

      视图中只保存了查询SQL的逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在了这条SQL查询语句上。

      local检查属性不会向上传递;

      视图中同样可以进行增删改查操作,但是由于视图中不存储数据,在增删改时,修改的时原表中的数据。

       


       

      存储过程

      小提示:在命令行中创建存储过程使用分号时,可能会出错,因此需要使用 delimiter + 自定义结束符 修改结束符。

       


      流程控制语句


      存储函数

      存储函数就是有返回值的存储过程,存储函数的参数只能是in类型的。 语法如下:

      存储函数使用较少,存储函数能实现的功能在存储过程中也可以实现,存储函数存在弊端,必须有返回值;


      触发器

      触发器类型OLD/NEW
      insert型触发器new表示将要或已经新增的数据。
      update型触发器old表示修改之前的数据,new表示将要修改或修改之后的数据
      delete型触发器old表示将要或已经删除的数据

      概述

      锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(CPU,RAM,IO)的争用意外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须和解决的一个问题,锁冲突也是影响数据库并发访问性能的重要因素。从这个角度来说,锁对数据库而言是尤其重要的,也更加复杂。

      全局锁

      执行数据备份方法

       

      表级锁

       

      行级锁


      innoDB引擎

      逻辑存储结构

       

      image-20240123163945695

      架构

      innodb存储引擎架构图

      image-20240123164819634

      show variables like '%参数';

       

       

      事务原理

      image-20240124153348927

       

      MVCC(⭐)


      MySQL管理

      系统数据库

      在MySQL安装完成后,自带的数据库。

      数据库 
      mysql存储MySQL服务器正常运行所需要的各种信息(时区、主从、用户、权限等)
      information_schema提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等。
      performance_schema为MySQL服务器运行时状态提供了一个底层监控功能,主要用于数据库服务器性能参数。
      sys包含了一系列方便DBA和开发人员利用performance_schema性能数据库进行调优和诊断的视图。

       

      常用工具

       


      本笔记到此结束... 下面的内容日后在进行更新!


       

      MySQL运维

      暂不更新.....待日后补充