我是靠谱客的博主 高挑太阳,最近开发中收集的这篇文章主要介绍MySQL数据库学习笔记MySQL数据库学习笔记前言一、关系型数据库二、SQL语句DDL DML DQL DCL笔记总结`,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MySQL数据库学习笔记


文章目录

  • MySQL数据库学习笔记
  • 前言
  • 一、关系型数据库
  • 二、SQL语句DDL DML DQL DCL
    • 1.DDL(Data Definition Language):
    • 2.DQL(Data Query Language):
      • 聚合函数
      • where 与 having 区别
      • 升序与排序
      • 分页
    • 3.DCL (Data Control Language):
      • 查询用户
      • 用户管理
      • 权限控制
    • 4.函数(Function):一段可以直接被另一段程序调用的程序或代码
      • 字符串函数:
      • 数值函数
      • 日期函数
      • 流程控制函数
    • 5.约束(Check)
    • 6.多表查询
      • 内连接:相当于A,B交集部分数据
      • 外连接:
      • 自连接:
      • UNION、 INTERSECT 、EXCEPT(并 ,交,差)
      • 7.子查询:SQL语句中嵌套SELECT语句
        • 一般子查询在WHERE FROM SELECT 之后
        • 标量子查询:返回结果是单个值(数字 ,字符串,日期等)常用符号< > =
        • 列子查询:返回的结果是一列(可以是多行)常用符号 IN ,NOT IN ,ANY,SOME , ALL
        • 行子查询:子查询返回结果是一行(可以使多列)常用符号 = <> in not in
        • 表子查询:返回结果多行多列 常用符号IN
          • IN 和EXISTS区别
    • 8.事务(Transactions)
      • 事务操作
      • 事务四大特性!!!(ACID)
      • 并发事务问题
      • 事务的隔离级别(用于解决并发事务问题)
      • 查看事务隔离级别
      • 设置事务隔离级别
    • 9.MySQL体系结构
        • 连接层(连接池)
        • 第二层架构
        • 引擎层 (Index索引...)
        • 存储层
    • 10.存储引擎
        • 存储引擎选择:
      • InnoDB:
      • MyISAM:
      • MEMORY
      • 主要重点存储引擎:
    • 11.索引(INDEX)
      • 有常见以下索引:
        • B+Tree索引
        • Hash索引
        • R-tree(空间索引)
        • Full-tree(全文索引)
        • 不同存储引擎支持实现不同的索引
      • 索引结构:
        • B-Tree(多路平衡查找树)
        • Hash:
      • 为什么InnoDB存储引擎选择使用B+tree索引结构
      • 索引分类
      • 聚集索引选取规则:
      • 有关索引SQL语句
    • 12. SQL语句执行情况
      • 查看语句执行频率
      • 慢查询日志
      • profile详情
      • explain执行计划(SQL语句里面表中的执行顺序)
    • 13.索引使用
      • 最左前缀法则
      • 范围查询
      • or连接条件
      • MySQL评估
      • 覆盖索引
      • 关于回表查询
      • 前缀索引
      • 单列索引:
      • 联合索引:即一个索引包含了多列
      • SQL提示
        • 优化:
        • 解决方案:
    • 14.索引设计原则:
    • 15.SQL优化
      • INSERT优化
      • 数据组织方式
        • 页分裂(主键乱序插入可能导致的现象)
        • 页合并
      • 主键设计原则
      • ORDER BY 优化
        • 在执行计划explain中 Extra
      • ORDER BY优化
        • 同时降序或升序查询
        • 一个降序一个升序查询
      • LIMIT优化
      • COUNT 优化
        • 不同存储请求实现COUNT函数
          • MyISAM引擎
          • InnoDB引擎
            • 优化思路
      • COUNT用法
        • count(*)
        • count(主键)
        • count(字段)
        • 没有not null约束:
        • 有not null引擎:
        • count(1)
        • 效率排序:
      • UPDATE 优化
    • 16.视图(VIEW)
      • 创建
      • 查询
      • 修改
      • 删除
        • 视图的检查选项
          • ASXCADED(默认)
          • LOCAL
      • 视图的更新
      • 视图的作用
    • 17.存储过程( PROCEDURE)
      • 特点
      • 创建
      • 查看存储过程
      • 删除
      • 注意!!!
      • 系统变量
      • 设置系统变量
      • 注意!!!
      • 赋值
      • IF
      • 传参
      • case语句、
      • LOOP
      • 游标(光标)
        • 游标的使用
        • 条件处理程序
      • 存储函数
      • characteristic说明
    • 18.触发器(TRIGGER)
      • 特性
      • 创建触发器
      • 查看触发器
      • 删除触发器
    • 19.锁
      • 粒度划分从 大->小
      • 全局锁简述
      • 表级锁简述
      • 全局锁
        • 特点
      • 表级锁
      • 元数据锁
      • 意向锁
      • 行级锁
        • 行锁(Record Lock)
        • 间隙锁(Gao Lock)
        • 临建锁(Next-Key Lock )
      • 共享锁(S)
      • 排它锁(X)
      • 间隙锁/临建锁-演示
        • 注意!!!
    • 20.InnoDB引擎
      • 逻辑存储结构
      • 内存结构
        • Buffer Pool :
        • Change Buffer 更改缓冲区(针对与非唯一二级索引页)
        • Change Buffer意义
        • Log Buffer 日志缓冲区
      • 磁盘结构
        • System Tablespace
        • File-Per-Table Tablespaces
        • General Tablespaces 通用表空间
        • Undo Tablespaces 撤销表空间
        • Temporary Tablespaces
      • Doublewrite Buffer Files 双写缓冲区
      • Redo Log重做日志
      • 架构-后台线程
        • Master Thread
        • IO Thread
        • Purge Thread
        • Page Cleaner Thread
    • 事务原理
      • redo log 持久性
      • undo log 原子性
    • MVCC
  • 笔记总结`


前言

例如:数据库除了基本使用还需要掌握以下能力:
事务 存储引擎 索引 SQL优化 锁 日志 主从复制 读写分离 分库分表

主流数据库管理系统:Oracle MySql MicroSoft Server


`

一、关系型数据库

建立关系模型基础上,由多张相互连接二维表组成
使用 表 利于维护 统一语言 方便使用

二、SQL语句DDL DML DQL DCL

1.DDL(Data Definition Language):

数据类型 :有符号范围无符号范围 (+,-) UNSIGNED
字符串类型:char(节省性能) varchar(节省空间)
日期类型

2.DQL(Data Query Language):

聚合函数

常见的有count max min avg sum 函数等等
SELECT 字段() FROM 表名
{使用聚合函数时 null值不参与聚合函数运算}

where 与 having 区别

where是分组前之前进行过滤,不满足where条件 不进行分组
having是分组后对结果进行过滤
where不能对聚合函数进行判断
having可以

SELECT
    字段列表(表头)
FROM
    表名列表
WHERE
    条件列表
GROUP BY
   字段分组列表
HAVING
  分组后条件列表
ORDER BY
  分页参数
UMIT

升序与排序

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排列方式 ,字段2 排列方式:
ASC 升序(默认) DESC 降序
如果多个排列方式,则先按字段1如果相等,则按字段2 排列方式

分页

SELECT 字段列表 FROM 表名 LIMIT 其实索引 ,查询记录数:
LIMIT不同数据库有不同的实现方式,这是区别数据库的方法
从0开始

字段名【AS】 别名

多个条件 and of 连接

3.DCL (Data Control Language):

管理数据库用户可以访问
控制数据库用户的访问权限

查询用户

USE mysql;
SELECT *FROM user;
查看user表可以知道mysql数据库下的用户
需要用到主机IP和用户名锁定用户

用户管理

创建用户
CREATE USER ‘用户名’@‘主机名’IDENTIFIED BY
修改用户密码
ALTER USER ‘用户名’@‘主机名’IDENTIFIED WITH mysql_native_password BY ‘密码’
删除用户
DROP USER 用户名’@‘主机名

权限控制

查询权限
SHOW GRANTS FOR 用户名’@‘主机名
授予权限
GRANT 权限列表 ON 数据库名 表名 TO 用户名’@‘主机名
撤销权限
REVOKE 权限列表 ON 数据库名 表名 TO 用户名’@‘主机名

ALL , ALL PRIVILEGES 所有权限

4.函数(Function):一段可以直接被另一段程序调用的程序或代码

SELECT 函数名() ;

字符串函数:

CONCAT(S1,S2…Sn) 字符串拼接
LOWER(str)UPPER 大小写转化
LPAD() RPAD() 左右填充 用到随机验证码案例
TRIM() 去掉字符串头部和尾部的空格
SUBSTRING() 返回字符串str从start位置器的len个长度的字符串

数值函数

CEIL(x) FlOOR(x) 向上/下取整
MOD(x,y) 模x/y
RAND() 返回0-1内的随机数
ROUND(x,y) 求参x的四舍五入 ,保留y个小数点

日期函数

CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 放回当前日期和时间
YEAR(date) MONTH(date) DAY(date) 获取指定年/月/日
DATE_ADD(date,INTERVAL exper type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2) 返回起始时间date1 和 结束时间date2 之间的天数

流程控制函数

IF(value,t,f) 如果true返回 t 否则 f
IFNULL(value1,value2)
CASE {WHEN THEN} {WHEN THEN} {WHEN THEN} …ELSE END

5.约束(Check)

作用于表中字段中的规则,用于限制存储在表中的数据
保证数据库中的数据正确完整和有效

非空约束 NOT NULL
唯一约束 UNIQUE
主键约束 PRIMARY KEY
默认约束 DEFAULT
检查约束 CHECK (保证字段满足某一个条件)
外键约束 FOREIGN KEY (让两张表数据之间的连接,保证数据的一直和完整)
自动增长 aoto_increment

创建表时:CONSTRAINT 外键名称 FOREIGN 外键字段名 REFERENCES 主表(主表列名)

修改表时: ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表 (主表列名)

删除外键: ALTER TABLE 表名 DROP FOREIGN KEY 外键名称

指定删除/更新行为:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表 (主表列名)+ ON UPDATE CASCADE ON DELETE CASCADE;

NO ACTION/RESTRICT(默认) 对父表进行操作时,首先检查是否有外键,如果有则不允许操作

CASCADE 对父表进行操作时,首先检查是否有外键,如果有则操作外键所在的子表中记录

SET NULL 对父表进行操作时,首先检查是否有外键,如果有则该子表外键值全为NULL

SET DEFAULT 父表有变化,子表将外键值列为一个默认

6.多表查询

ER图转化为具体的关系模式存在以下关系

多对一关系:
实现:在多的一方建立外键,指向一的一方的主键
多对多关系:
实现:建立第三张中间表,中间表至少包含两个外键,此外建分别关联两方主键
一对一关系:
实现:在任意一方加入外键,关联另外一方的主键, 并且设置外键为唯一的(UNIQUE)

SELECT * FROM 表A , 表B;(会出现笛卡尔现象)
!!!多表查询时,需要消除重复出现的笛卡尔积
解决方法
SELECT * FROM 表A , 表B WHERE 条件 ;

查询分类:

内连接:相当于A,B交集部分数据

外连接:

左外连接:查询左表所有数据以及交集部分
右外连接:查询右表所有数据以及交集部分
自连接:当前表与自身的连接查询,自连接必须使用表别名

隐式内连接:SELECT * FROM 表A , 表B WHERE 条件 ;
显示内连接:SELECT * FROM 表A [INNER] JOIN 表B ON 连接条件 ;

(左右外连接可以将NULL值也提取出来弥补内连接的不足)
左外连接 :SELECT 字段列表 FROM 表A LEFT [OUTER] JOIN 表B ON 条件
右外连接 :SELECT 字段列表 FROM 表A RIGHT [OUTER] JOIN 表B ON 条件

自连接:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件

UNION、 INTERSECT 、EXCEPT(并 ,交,差)

SELECT * FROM 表A …

UNION/UNION ALL

SELECT * FROM 表B …、

使用UNION 必须SELECT 列数和类型一致一样
UNION :表A表B的查询结果连接去重后返回 UNION ALL 不去重

7.子查询:SQL语句中嵌套SELECT语句

一般子查询在WHERE FROM SELECT 之后

标量子查询:返回结果是单个值(数字 ,字符串,日期等)常用符号< > =

列子查询:返回的结果是一列(可以是多行)常用符号 IN ,NOT IN ,ANY,SOME , ALL

IN/NOT IN 不在/在指定范围集合内多选一
ANY 子查询结果返回列表中,有任意一个满足即可
SOME 与ANY等同
ALL 子查询结果返回列表的所有值都必须满足
SELECT * FROM 表名 WHERE 条件>/</== all/any/some(子查询结果)

行子查询:子查询返回结果是一行(可以使多列)常用符号 = <> in not in

SELECT FROM 表名 WHERE (字段A,字段B) = (子查询结果)

表子查询:返回结果多行多列 常用符号IN

TIPS:

IN 和EXISTS区别

https://www.cnblogs.com/liyasong/p/sql_in_exists.html
执行顺序

SELECT …WHERE XXX IN (SELECT)
先执行(SELECT)然后 判断 XXXX IN ()

SELECT … WHERE EXISTS(SELECT WHERE XXXX)
先执行SELECT … 然后 执行(SELECT WHERE XXX )

8.事务(Transactions)

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

例如:A转账给B1000元:A账户-1000那么B账户同时+1000
转账操作:1查询A余额 2 A余额-1000 3 B余额+1000

事务操作

查看/设置事务提交方式 SELECT @@autocommit(自动提交)

SET @@autocommit = 0(手动提交);
执行事务
提交事务 COMMIT(未出现异常) 回滚事务 ROLLBACK(出现异常回滚事务,保证数据完整)

开启事务 STAT TRANSACTION 或 BEGIN
执行事务
提交事务 COMMIN 回滚事务 ROLLBACK

事务四大特性!!!(ACID)

原子性(Atomicity) 事务是不可分割的最小操作单位,要么全成功,要么全部失败
一致性(Consistency)事务完成时,必须是所有数据都保持一直状态
隔离性(Isolation)数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durabilaty)事务一旦提交或回滚,对数据库总的数据的改变就是永久的

并发事务问题

脏读:一个事务读到另外一个事务还没有提交(COMMIT)的数据
不可重复读:一个事物先后读取同一条记录,但两次读取的数据不同
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数
据已经存在。

事务的隔离级别(用于解决并发事务问题)

隔离级别脏读不可重复读幻读
Read uncommitted出现出现出现
Read committed(oracle默认)不出现出现出现
Repeatable Read(MYSQL默认)不出现不出现出现
Serializable不出现不出现不出现

查看事务隔离级别

SEELECT @TRANSACTION_ISOLATION:

设置事务隔离级别

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [事务隔离级别]

9.MySQL体系结构

在这里插入图片描述

连接层(连接池)

最上层是一些客户端和连接服务,主要完成一些类似连接处理、授权认证,相关
安全方案。服务器也会为安全接入的每个客户端验证它所具有的权限
服务层(SQL接口,解析器,查询优化器,缓存)

第二层架构

主要完成大多数的核心服务功能,如SQL接口,完成缓存的查询,SQL的分析
和优化,部分内置函数的执行,所有跨存储引擎的功能也在这一次实现:如过程、函数等

引擎层 (Index索引…)

存储引擎真正负责MySQL中的数据的存取和提取,服务器通过API和存储引擎进行通信
不同的存储引擎不同功能

存储层

主要是将数据存储在文件系统上,与完成存储引擎的交互

10.存储引擎

存储数据、建立索引 、更新/查询数据等技术的实现方式,存储引擎是基于表,不基于库,所以存储引擎也可称为表类型
默认InnoDB
创建表时指定存储引擎
CREATE TABLE 表名{…}ENGINE = INNODB

查看当前数据库支持的存储引擎 SHOW ENGINES

InnoDB 是一种兼顾高可靠性和高性能存储引擎

特点:DML操作遵循ACID模型,支持事务,行级锁,提高并发访问性能
支持外键FOREIGN约束 保证数据的完整性和正确性
xxx.idb是以inooDB引擎表空间文件

逻辑存储结构 TableSpace -> Segment -> Extent -> Row

MyISAM 是MySQL早期默认存储引擎
特点不支持事务 不支持外键 支持表锁,不支持行锁 访问速度快
xx.sdl存储表结构信息 xxx.MYD存储数据 xxx.MYI存储索引

Memory 存储在内存中,收到硬件,电源问题,只能作为临时表或缓存使用
内存存放 hash索引(默认)
xxx.sdi存储表信息结构

存储引擎选择:

根据应用系统的特点选择合适的存储引擎,复杂的应用系统可以多种引擎组合使用

InnoDB:

Mysql的默认存储引擎,支持事务,外键。如果应用对事务的完整性有高要求,
在并发的条件下要求数据一致性,数据操作除了插入和查询之外,还有更新,删除等操作,那么InnoDN引擎合适

MyISAM:

以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务完整性,并发性要求不高
则选择MyISAM

MEMORY

将所有数据保存在内容中,访问速度快,常用于临时表以及缓存,对表大小有显示,太大无法
缓存在内存中,而且无法保障数据的安全性

主要重点存储引擎:

INNODB与MyISAM:事务,外键,行级锁
INNODB:存储业务系统中对与事务,数据完整性要求较高的核心数据
MyISAM 存储业务系统的非核心事务

11.索引(INDEX)

是帮助MySQL 高效获取的数据结构(有序)
建立索引是以空间换取性能的一种手段

优势:
提高数据检索效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗
劣势:
索引列占空间
索引大大提高了查询效率,但降低表更新的速度,如进行INSERT UPDATE DELETE操作

MySQL索引是在存储索引层实现的,不同的存储引擎不同结构

有常见以下索引:

B+Tree索引

最常见的索引类型,大部分引擎支持B+树索引

Hash索引

底层数据结构用哈希表实现,只有精确索引列的查询有效,不支持范围查询

R-tree(空间索引)

MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型

Full-tree(全文索引)

倒排索引,快速匹配文档的方式

不同存储引擎支持实现不同的索引

索引存储引擎
B+treeInnoDB . MyISAM Memory索引(默认)
HashMemory
R-treeMyISAM
Full-textMyISAM . 5.6版本支持InnoDB

索引结构:

B-Tree(多路平衡查找树)

B+Tree 与B-Tree区别 : 所有数据都出现在叶子结点,叶子结点形成一个单向列表

MySQL索引对经典B+Tree进行优化,增加一个指向相邻叶子结点的链表指针,从而形成
带有顺讯的指针的B+Tree,提高访问的性能

Hash:

将建值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中
如果多个建值,映射到一个相同的槽位上就产生hash冲突,通过链表解决
Hash索引特点:
只能用于对等比较,不支持范围查询
无法完成索引排序操作
查询效率高,通常一次检索,效率高于B+tree索引

在MySQL ,支持hash索引的是Memory索引,而InnoDB中具有自适应的hash功能
hash索引是存储引擎根据B+Tree索引在指定条件下自动构成的

为什么InnoDB存储引擎选择使用B+tree索引结构

相比于二叉树,层级少,搜索效率高。B-tree,无论是叶子结点还是非叶子结点都会保存数据,这样导致一页中存储的减值减少、指针也减少,要同时保存大量数据,只能增加树的高度,导致性能降低
而hash不支持范围匹配与排序操作

索引分类

索引描述
主键索引表中主键创建的索引,默认自动创建,只能一个 PRIMARY
唯一索引避免同一个表中某数据值重复 可以多个 UNIQUE
常规索引快速定位 可多个
全文索引查找文中关键值,而不是比较索引中的值 FULLTEXT
聚集索引(Clustered index)将数据存储与索引放到了一块,索引结构的叶子结点保存了整行(ROW)数据 必须有,只有一个
二级索引(Secondary index)将数据与索引分开存储,索引结构的叶子结点关联的是对应的主键 可存在多个

聚集索引选取规则:

如果存在主键,主键索引就是聚集索引
如果不存在主键 将使用第一个唯一(UNIQUE)索引作为聚集索引
如果没有主键,则没有合适的唯一索引,InnoDB会自动生成一个rowid作为隐藏的聚集索引

有关索引SQL语句

创建索引
CREATE [UNIQUE FULLTEXT] INDEX index_name ON table_name {index col name …,}
查看索引
SHOW INDEX FROM table_name
删除索引
DROP INDEX index_name ON table_name

12. SQL语句执行情况

通过一些数据库@@全局变量和一些命令可以查看SQL语句执行时的执行顺序和执行内容如:是否使用索引,使用的索引种类,sql语句执行时间。通过查看这些执行情况可以帮助我们通过建立索引已经建立怎样的索引优化SQL语句

查看语句执行频率

SHOW GLOBAL_STATUS LIKE “com___”;

慢查询日志

记录了所有执行时间超过指定参数的所有SQL语句日志
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件中(etcmy.cnf)中配置如下
开启
slow_query_log =1
设置时间为2秒,超过两秒视为慢查询,记录
long_query_time = 2

profile详情

show profiles 能够在SQL优化时了解时间耗损
用过have_profiling参数,查看当前MySQL是否支持profile操作

SELECT @@have_profiling
默认关闭,通过set语句在session、global级别开启@profiling
SET profiling =1;

执行一些列SQL操作,通过指令查看执行耗损
每一条SQL基本耗损
show profiles

指定query_id的SQL语句每个阶段耗时
show profile for query query_id;

查看query_id 的sql语句CPU使用情况
show profile cpu for query query_id

explain执行计划(SQL语句里面表中的执行顺序)

EXPLAIN 或者DESC命令获取MySQL如何执行SELECT语句的信息,包括SELECT
语句执行过程中如何连接和连接的顺序

EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件

id
select 查询的序列号,表示查询中执行select子句或者是操作表的顺序
如果ID相同 执行顺序从上往下,ID不同,值越大,越先执行

select_type
标识SELECT的类型,常见的取值有SIMPLE(简单表,不适用表连接或者子查询),PRIMARY(主查询,显示外层的查询)
UNION(UNION中的第二个或者后面的查询语句),SUBQUERY(SELECT/WHERE之后包含了子查询)

type
标识连接类型 性能从好到差类型为NULL,system,constant,eq_ref,ref,range,index,all

possible_key
可能用到的索引

Key
实际索引,如果NULL 则没有使用索引

key_len
索引中使用的字节数,该值为索引字段的最大可能长度,并非实际长度,越短越好

rows
MySQL认为必须执行的查询行数,InnoDB引擎的表中,是一个估计值

filtered
标识返回结果的行数占需读取行数的百分比,越大越好

Extra
using index condition 查找使用了索引,但是需要回表查询数据
usig where ;using index ;查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

13.索引使用

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则,最左前缀法则指的是
查询从索引的最左列开始,并且不跳过索引中的列
如果跳跃某一列,索引将部分失效(后面的字段索引失效)
比如index(a,b,c)
使用索引时不能必须按照从左到右,中间不断,使用索引顺序。

范围查询

联合索引中 ,出现范围查询(<,>),范围查询右侧的列索引失效
使用(<=,>=)规避

or连接条件

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

MySQL评估

MySQL数据库会有自带的评估系统判断如果使用索引比全表扫描慢,则不使用索引

覆盖索引

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到)
减少select*

SELECT 字段一 ,字段二 FROM 表名 WHERE 字段一满足的条件
优化:如果使用单例索引,仅仅只是建立了字段一的索引,但是SELECT 还要求返回字段二(此时会进行回表查询浪费大量时间)
解决方案:将字段一和字段二之间建立联合索引,联合索引是二级索引,叶子结点下面挂着字段一和字段二的值还有ID值;

关于回表查询

Innodb引擎只存在聚集索引和普通索引
聚集索引遍历树定位ID确定整行的记录
普通索引遍历树定位ID然后再次遍历树通过ID确定整行记录
具体的细节与底层结构请自行搜索。

前缀索引

当字段类型为字符串,有时候需要很长的字符串,这让索引变大,查询时消耗大量磁盘IO,
影响查询效率,此时可以之将字符串的一部分前缀,建立索引,节省索引空间从而提高效率

CREATE INDEX inx_xxxxx table_name(column(N)) N截取长度

索引长度根据索引选择性:
选择性是指不重复的索引值(基数)和数据表的记录总是比值
索引选择性越高查询效率越高,唯一索引的选择性是1,这是最好的索引选择性与性能
选择性公式:
非字符串
SELECT COUNT(DISTINCT email) / COUNT() FROM tb_user
字符串
SELECT COUNT(DISTINCT SUBSTRING(email,1,5)) / COUNT(
) from tb_user

单列索引:

即一个索引只包含单列

联合索引:即一个索引包含了多列

SQL提示

优化数据库的一个重要手段,就是SQL语句中加入一些人为的提示来达到优化操作的目的
use /ignore /force index
explain select *from table_name use/ignore/force index() where 条件

多条件查询时,会有SQL优化器评估并选择索引

SELECT 字段一 ,字段二 FROM 表名 WHERE 字段一满足的条件

优化:

如果使用单例索引,仅仅只是建立了字段一的索引,但是SELECT 还要求返回字段二(此时会进行回表查询浪费大量时间)

解决方案:

将字段一和字段二之间建立联合索引,联合索引是二级索引,叶子结点下面挂着字段一和字段二的值还有ID值;
续:要满足最左原则:创建联合索引 index(字段1,字段2) 同时SELECT 字段一,字段二

14.索引设计原则:

  • 1针对数据量大,查询频繁的表
  • 2 常使用WHERE ORDERBY GROUP BYde
  • 3 区分度/选择性 高的表(身份证号,手机号)
  • 4 字符串类型的字段,字段的长度常,对于字段特点(前几段区分度高),建立前缀索引
  • 5尽量使用联合索引,减少使用单列索引,联合索引很多时候可以覆盖索引,节省空间,避免回表查询,提高效率
  • 6控制索引数量,多了会影响增删改查的效率和磁盘空
  • 7 如果索引列不能存储NULL值,创建表时使用NOTNULL约束他。当SQL优化器知道每列是否包含NULL值,可以确定哪个索引利于查询

15.SQL优化

INSERT优化

批量插入
insert into tb_text values() , (),();

手动提交事务
start transaction;
insert into tb_test values();
insert into tb_test values();
insert into tb_test values();
commit

主键顺序插入
1 2 3 4 5 6 7 8

大批量插入数据
如果大批量数据插入,使用insert语句性能低,此时 可以使用MySQL数据库提供
的load指令插入
#客户端连接服务器时 ,加上参数 --local-infile
mysql–local-infile -u root -p
设置参数1
set global local_infile = 1;
执行事先准备好的数据,加载到表结构
load data local infile ‘/root/sal1/log’ into ‘tb_user’ fields terminated by ‘,’ lines terminated by ‘n’;

主键顺序插入性能高于乱序插入

数据组织方式

在InnoDB引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表成为 索引组织表 index organized table

页分裂(主键乱序插入可能导致的现象)

页可以为空,也可以填充一半,也可以填充100% 每个页 包含了2-N行数据
如果一行数据过大,会溢出,根据主键排列;

页合并

当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记为删除并且它的空间变得
允许被其他记录声明使用。
当页中删除的记录达到MERGE_THRESHOLD默认页为50%
InnoDB会开始寻找靠近的页(前或后)看看是否可以将两个页
合并以优化空间使用

主键设计原则

满足业务需求情况下,尽量降低主键的长度
插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键
尽量不要使用UUID 做主键或者其他自然主键如身份证号(长度过长)
业务操作时,减少主键的修改

ORDER BY 优化

在执行计划explain中 Extra

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

Using index 通过有序索引顺序扫描直接返回有序数据,这种情况即为using index 不要额外排序,操作效率高
没有创建索引时,根据age phone 进行排序
explain select id, age ,phone , from tb_user order by age ,phone

ORDER BY优化

同时降序或升序查询

创建索引
create index idx_user_age_phone_aa on tb_user(age,phone)
创建索引后,根据age,phone进行升序排序
explain select id age phone from tb_user order by age ,phone
创建索引后,根据age,phone进行降序排序
explain select id,age,phone from tb)user order by age desc phone desc;

一个降序一个升序查询

根据age,phone进行降序一个升序,一个降序
explain select id ,age , phone from tb_user order by age asc m phone desc;
创建索引
create index idx_user_age_phone_ad on tb_user(age asc , phone desc)
根据age,phone 进行一个升序 一个降序
explain select id,age,phone from tb_user order by age asc ,phone desc;

根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
尽量使用覆盖索引(查询字段和和条件字段都在同一索引)
多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区sort_buffer_size(default 256k)

实例:
#删除掉目前的联合索引 idx_pro_sta on tb_user;
drop index idx_user_pro_age_sta on tb_user;
#执行分组操作,根据profession字段分组
explain select profession , count() from tb_user group by profession ;
#创建索引
Create index idx_user_pro_age_sta on tb_user(profession , age , staus);
#执行分组操作,根据profession字段分组
explain select profession , count(
) from tb_user group by profession;
#执行分组操作,根据profession字段分组
explain select profession , count(*) from tb_user group by profession , age;

在分组操作时,可以通过索引来提高效率
在分组操作时,索引的使用也满足最左前缀法则

LIMIT优化

常见问题 LIMIT 20000000,10 此时需要MySQL排序前2000000000010记录
仅仅返回200000000000 200000000000010 十条数据的记录,其他记录丢弃,查询排序的代价非常大
优化思路:一般分页查询时,通过创建覆盖索引,可以通过覆盖索引加子查询形式进行优化
explain select * from tb_sku t, (select id from tb_sku order by id limit 200000,10) a where t.id = a.id

COUNT 优化

explain select count(*) from tb_user:

不同存储请求实现COUNT函数

MyISAM引擎

把一个表的总行数存在了磁盘上,因此执行count(*)直接返回这个数,效率高

InnoDB引擎

麻烦,它执行count(*) 时候,需要把数据一行行 的从引擎读出来,然后累计计数

优化思路

自己计数:插入数据同时加一 插入数据同时减一,自己维护

如果count函数的参数不是NULL,累计值加一,否则不加

COUNT用法

count(*)

记录总记录数,有专门优化,不取值,服务层直接按行进行累加

count(主键)

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

count(字段)

没有not null约束:

InnoDB引擎会遍历整张表每一行的字段都取出来,返回给服务层,服务层有无null

有not null引擎:

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

count(1)

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

效率排序:

count(字段)<count(主键)<count(1)约等于count() 尽量使用count(

UPDATE 优化

使用UPDATE时,尽量使用索引
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁

16.视图(VIEW)

一种虚拟存在的表。视图中的数据并不在数据库中存在,行和列数据来自定义视图查询中使用的表,并且
在使用视图时动态生成
视图保存了查询SQL逻辑,不保存查询结果。

创建

CREATE [OR REPLACE] VIEW 视图名称[(列表列名)] AS SELECT [WITH[…] ]

查询

查看数仓健视图语句 : SHOWCREATE VIEW 视图名称
查看视图数据 SELECT * RROM 视图名称

修改

CREATE [OR REPLACE] VIEW 视图名称 [(列表列名)] AS SELECT 语句[]
ALTER VIEW 视图名称 AS SELECT 语句 []

删除

DROP VIEW [IF EXISTS] 视图名称…

视图的检查选项

当使用WITH CHECK OPTION 子句创建视图时,MySQK会通过视图检查正在更改的每行,例如 插入 更新 删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图
他还会检查依赖视图中的规则以保持一致性。为了确定检查范围,MySQL提供了两个选项:
CASXCADED(默认)级联 和LOCAL

ASXCADED(默认)

CREATE VIEW V1 AS SELECT , name from student where id <=20 with cascaded check option;

CREATE VIEW V2 AS SELECT , name from v1 where id >=10 with cascaded check option

create view v3 as select id , name from v2 where id <= 15;

LOCAL

create view v1 as select id , name from student where id <= 15

create view v2 as select id , name from v1 where id >= 10 with local check option;

create view v3 as select id , name from v2 where id < 20;

视图的更新

视图中的行与基础女表中的行之间必须存在一对一的关系。以下任何一项不可更新

  1. 聚合函数或窗口函数
  2. DISTINCT
  3. GROUPY BY
  4. HAVING
  5. UNION 或者UNION ALL

视图的作用

简单,简化用户对数据的理解,简化用户操作。常被使用的查询可以定义为视图,使用户以后查询不必全部条件
安全,数据库可以授权,但不能授权到数据库特定行和特定的列。通过视图用户只能查询和修改所见到的数据
帮助用户理解真实表结构带来变化的影响

17.存储过程( PROCEDURE)

事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输,提高数据处理效率存储过程是数据库SQL语言层面的代码封装与重用

特点

封装,复用
可以接收参数,也可以返回数据
减少网络交互,效率提升

创建

CREATE PROCEDURE 存储过程名称{参数列表}
BEGIN
…SQL语句
END;
调用
CALL 名称{参数}

查看存储过程

SELECT * FROM INFORMATION_SCHEMA ROUTINES WHERE ROUTINE_SCHEMA='XX’查询指定数据库的存储过程与状态信息
SHOW CREATE PROCEDURE 存储过程的名称 ; 查询某个存储过程的定义

删除

DROP PROCEDURE [IF EXISTS] 存储过程名称

注意!!!

在命令行中,执行创建过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符

系统变量

系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面,分为全局变量GLOBAL 和会话变量SESSION
查看系统变量
SHOW [SESSION|GLOVAL] VARIABLES 查看所有系统变量
SHOW [SESSION|GLOVAL] VARIABLES LIKE ‘…’ 模糊查询系统变量
SELECT @@[SESSION|GLOBAL] 准确查看具体系统变量

设置系统变量

SET [SESSION|GLOBAL] 系统变量名= 值
SET @@[SESSION|GLOBAL] 系统变量名= 值

注意!!!

如果没有指定SESSION / GLOBAL 默认是SESSION 会话变量
mysql服务器重新启动之后,所设置的全局参数会失效,要想不失效,可在/etc/my.cnf 中配置

用户变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用时"@变量名",作用域为当前连接

赋值

SET @var_name = expr[@var_name = expr]…
SET @var_name := expr[@var_name := expr]…
建议使用 :=

SELECT @var_name := expr[@var_name := expr]…
SELECT 字段名 INTO @var_name FROM 表名

使用SELECT @var_name:
注意 用户定义的变量无需对其声明或初始化,只不过获取到的值为NULL

局部变量根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明,可作为存储过程内的局部变量
和输入参数,局部变量的范围是在其声明的BEGIN///END块

IF

IF 条件 THEN

ELSE 条件 THEN

ELSE

END IF

传参

参数 IN 输入,需要调用时传入值(默认) OUT输出 也可以返回值 INOUT 作为输入参数也可输出参数

CREATE PROCEDURE 存储过程名称{[IN/OUT/INOUT 参数名 参数类型]}
BEGIN
–SQL语句

END;

case语句、

CASE
WHEN search_condition1 THEN statement_list1

ELSE statement_list
END CASE;

WHILE 有条件循环控制的语句。满足条件后,再执行循环体
WHILE 条件 DO
SQL 逻辑…
END WHILE ;

REPEAT 有条件的循环控制语句,当满足条件的时候推出循环
REPEAT
SQL逻辑
UNTIL 条件
END REPEAT

LOOP

实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,用于实现简单的死循环

LEAVE 配合循环使用,退出循环
ITERATE 必须在循环中吗,作用用于跳过当前循环剩下语句,直接进入下一次循环
[begin_lable] LOOP
SQL逻辑…
END LOOP [end_lable]

LEAVE label 退出指定标记的循环体
ITERATE label 直接进入下一次循环

游标(光标)

CURSOP 使用来存储结果集的数据类型,在存储过程和函数中可使用游标对结果集进行循环处理。

游标的使用

声明游标 DECLARE 游标名称 CURSOR FOR 查询语句
打开游标 OPEN 游标名称
获取游标记录 FETCH 游标名称 INTO 变量 [变量]
关闭游标 CLOSE 游标名称

条件处理程序

条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤
DECLAR handler_action HANDLER FOR condition_value [conditon_value] …statement;

handler_action
CONTINUE继续执行当前程序
EXIT 终止执行当前程序

condition_value
SQLSTATE sqlstate_value(状态码,如2000) ;
sqlstate_value:
SQLWARNING 所有以01开头的SQLSTATE代码的简写
NOT FOUND 所有以02开头的SQLSTATE代码的缩写
SQLEXCEPTION 所有没有被SQLWARNING 或NOT FOUND补货的SQLSTATE代码的简写

存储函数

有返回值的存储过程,存储参数只能是IN类型
CREATE FUNCTION 存储函数名称([参数列表])
RETURN type[characteristic]
BEGIN
–SQL语句
RETURN…;
END;

characteristic说明

DETERMINISTIC 相同的输入参数总是产生相同的结果
NO SQL 不包含SQL语句
READS SQL DATA :包含读取数据的语句,但不包含写入数据的语句

18.触发器(TRIGGER)

与表有关的数据库对象,在insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句

特性

可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作
使用别名OLD和NEW来引发触发器中发生变化的记录内容,这与其他的数据库相似。
现在触发器只支持行级触发,不支持语句级触发

INSERT 型触发器 NEW 表示将要或者已经新增的数据
UPDATE 型触发器 OLD 表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETE型触发器 OLD表示将要或者已经删除的数据

创建触发器

CREATE TRIGGER trigger_name
BEFORE / AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW --行级触发器
BEGIN
trigger_stmt;
END;

查看触发器

SHOW TRIGGERS;

删除触发器

DROP TRIGGER[Sschema_name]trigger_name;如果没有指定schema_name 默认当前数据库

19.锁

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,出传统的计算资源(CPU,RAM , I/O)
的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的问题】
锁冲突也是影响数据库并发访问性能的一个重要因素。

粒度划分从 大->小

全局锁简述

锁定数据库中的所有表

表级锁简述

每次操作锁住整张表 行级锁:每次操作锁住对应的行数据

全局锁

对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务
提交语句都将被阻塞
典型例子:全库的逻辑备份,对所有表进行锁定,从而获取一致性视图,保证数据的完整性

flush tables with read lock;
mysqldump -uroot -p1234 itcast > itcast.sql
unlock tables;

特点

数据库中加全局锁,是一个比较重的操作,存在一下问题
如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆
如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟

在InooDB引擎中,在备份时机上参数 --single-transaction 参数来完成不枷锁的一致性数据备份
mysqldump --single-transaction -uroot -paswword itcast > itcast.sql

表级锁

每次操作锁住整张表。粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM,InnoDB,BDB等引擎中

表级锁分类 表锁 元数据锁(meta data lock,MDL) 意向锁

表锁:表共享读锁read lock 表独占写锁write lock
语法;加锁 lock tables 表名 …read/write 释放锁 unlock tables/ 客户端断开连接

读锁不会阻塞其他客户端的读,但是会阻塞写。写锁即会阻塞其他客户端的读,又会阻塞其他客户端的写

元数据锁

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候回自动加上。
MDL锁主要维护表元数据的一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
为了避免DML与DDL冲突,保证读写的正确性。

在MySql5.5加入了MDL ,当对一张表进行增删改查时候,加DML读锁(共享);
当对表结构进行变更操作的时候 ,加MDL写锁(排他)
查看元数据锁
select object_type,object_schema,object_name ,lock_type,lock_duraction from performance_schema.metadata_locks

意向锁

为了避免DML在执行时,行锁与表锁的冲突,在InnoDB中引入了意向锁
使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查
意向共享锁(IS):select … lock in share mode添加 | 与表锁共享锁(read)兼容,与表锁排它锁(write)互斥
意向排它锁(IX) : insert , update ,delete select…for update添加 | 与表锁共享锁(read)和排它锁(write)都互斥。意向锁之间不会互斥
查看意向锁与行锁加锁情况:
select object_schema , object_name,index_name,lock_type , lock_mode , lock_data from performance_schema.data_locks

行级锁

每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB引擎中
InnoDB数据时基于索引组织的,行锁是通过索引上的索引项加锁实现的,而把不是对记录加的锁。
三类:

行锁(Record Lock)

锁定单个行记录的锁,放置其它事务对此进行update和delete 在RC ,RR隔离级别下都支持

间隙锁(Gao Lock)

锁定索引记录间隙(不含该记录),确保索引记录间隙不变,放置其他事物在这个间隙进行insert,产生幻读。在RR隔离级别下都支持

临建锁(Next-Key Lock )

行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持

InnoDB实现以下行锁:

共享锁(S)

允许一个事物去读一行,组织其他事物获得相同数据集的排它锁

排它锁(X)

允许获取排它锁的事务更新数据,组织其他事物获得相同数据集的共享锁和排它锁

INSERT/UPDATE/DELETE 排它锁 自动加锁
SELECT 正常 不加任何锁
SELECT … LOCK IN SHARE MODE 共享锁 需要手动在SELECT 之后加LOCK IN SHARE MODE
SELECT … FOR UPDATE 排它锁 需要手动在SELECT之后加FOR UPDATE

默认下,InnoDB在REPEATABLE READ 事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,放置幻读
1 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁
2 InnoDB的行锁是针对与索引加的锁,不通过索引条件检索数据,InnoDB将对表中的所有记录加锁,此时就会升级为表锁

间隙锁/临建锁-演示

1索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
例子:主键索引 id =1 和 id=7中间不允许操作
2 索引上的等值查询(普通索引),向右遍历时最后一个值不蛮子查询需求时,next-key lock退化为间隙锁
例子:普通索引 id =1 和 id = 7 之间和 id=1之前防止插入一个id = 7的事务
3 索引上的范围查询(唯一索引)未访问到不满足条件的第一个值为止

注意!!!

间隙锁唯一目的是放置其它事务插入间隙。间隙锁可以共存,一个事务才用的间隙锁不会阻止另一个事务在同一间隙上才用间隙锁

20.InnoDB引擎

逻辑存储结构

Tablespace ->Segent->Extent->Page->Row
Tablespace 表空间(ibd文件)一个mysql实例可以对应多个表空间,用于存储记录,索引等数据

Segent 分为数据段(Leaf node segment),索引端(Non-leaf node segment) 回滚段(Rollback segment)
InnoDB是索引组织表,数据段就是B+树的叶子结点,索引段位B+树 的非叶子节点。

Extent 表空间的单元结构,每个区大小1m。默认,InnoDB存储引擎页大小为16k即一个区共有64个连续的页

Page 是InnoDB存储引擎磁盘管理的最小单元,每个页大小的默认为16KB。为了保证页
的连续性,InnoDB存储引擎每次从磁盘申请4-5个区Extent

Row InnoDB存储引擎数据时按行进行存放的

Trx_id 每次对某条记录进行改动时,都会吧对应的事务id赋值给trx_id隐藏列
Roll_pointer 每次对某条记录进行改动时,都会吧旧的版本写入到undo日志中,然后
这个隐藏列就相当于一个指针,可以通过塔找到记录修改前的信息

架构(结合架构图)
MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有奔溃回复特性
在日常开发中使用广泛。

内存结构

Buffer Pool :

缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,
在执行增删查改操作时,先操作缓冲池中的数据(弄缓冲池没有数据,则从磁盘加载并缓存)
然后以一定频率刷新到磁盘,从而减少磁盘IO加快处理速度

缓冲池以Page为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型
free page 空间page 从未使用
clean page 被使用page,数据未被修改过
dirty page 脏页,被使用page 数据被修改过,也中数据与磁盘数据产生了不一致

Change Buffer 更改缓冲区(针对与非唯一二级索引页)

在执行DML语句时,如果这些数据page没在Buffer Pool中,不会直接操作磁盘,而是将数据变更才能在更改缓冲区Change Buffer,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中

Change Buffer意义

与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新可能会影响索引树
中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量磁盘IO。有了ChangeBuffer之后,我们可以在缓冲池中进行合并
处理,并减少磁盘IO

Adaptive Has Index:自适应hash索引,用于优化对Bffer Poll数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,
如果观察到hash索引可以提升速度吗,则建立hash索引,称之为自适应hash索引
自适应哈希索引,无需人工干预,是根据系统情况自动完成
参数 adaptive_hash_index

Log Buffer 日志缓冲区

用于保存要写入到磁盘中的log日志数据(redo log , undo log),默认16mb
日志缓冲区的日志会定期刷新到磁盘中。如果需要更新插入 或删除许多行的事务,增加日志缓冲区的大小可以
节省磁盘I/O
参数 innodb_log_buffer_size:缓冲区大小 innodb_flush_log_at_trx_commit : 日持刷新到磁盘时机
日持刷新到磁盘时机
1 日志在每次事务提交时写入并刷新到磁盘
0 每秒将日志写入并刷新到磁盘一次
2 日志在每次事务提交后写入,并每秒刷新到磁盘一次

磁盘结构

System Tablespace

系统表空间是更改缓冲区的存储区域,如果表是系统表空间而不是
每个表文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x中还包含InnoDB数据库字典,undolog等)
参数 innodb_data_file_path

File-Per-Table Tablespaces

每个表的文件表空间包含耽搁InnoDB表的数据和索引,
并存储在文件系统上的单个数据文件中
参数innodb_file_per_table

General Tablespaces 通用表空间

需要通过CREATE TABLESPACE 语法创建同通用表空间,创建表时可指定该表空间
CREATE TABLESPACE xxx ADD
DATAFILE ‘file_name’
ENGINE = engine_name;

CREATE TABLE xxx … TABLESPACE ts_name

Undo Tablespaces 撤销表空间

MySQL实例在初始化时会自动创建两个默认的Undo表空间(初始大小16mb),用于与存储undo log 日志

Temporary Tablespaces

InnoDB使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据

Doublewrite Buffer Files 双写缓冲区

innoDB引擎将数据也从Buffer Pool刷新到磁盘前
先将数据页写入双写缓冲区文件中,便于系统异常时回复数据

Redo Log重做日志

是用来实现事务的持久性。该日志文件又两部分组成:重做日志缓冲(redo log buffer)已经重做日志文件(redo log)前者是在内存中,后者是在磁盘中。当食物提交后会把所有修改信息存到该日志中,用于刷新脏页到磁盘时,发生错误时,进行数据恢复使用
以循环方式谢日冲作日志文件,涉及两个文件 ib_logfile0 ib_logfile1

架构-后台线程

Master Thread

核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性
还包括脏页的刷新,合并并插入缓存,undo页的回收

IO Thread

在InnoDB存储引擎中大量使用了AIO来处理IO请求,这样可以极大的提高数据库的性能,而IO Thread主要负责这些IO请求毁掉
Read thread 4 负责读操作 Write thread 4 负责写操作 Log thread 1 负责将日志缓冲区刷新到磁盘 insert buffer thread 1 负责将写缓冲区内容刷新到磁盘

Purge Thread

用于回收事务已经提交了的undo log 事务提交之后 undo log 可能不用,就用于回收

Page Cleaner Thread

协助Master Thread刷新脏页到磁盘的线程,他可以减轻Master Thread 的工作压力,减少阻塞

事务原理

redo log 持久性

重做日志,记录的是事务提交时数据页的物理修改,用来实现事务的持久性
该日志文件由两部分构成:重做日志缓冲(redo log buffer) 和 重做日志文件(redo log file) 前者在内存中,后者在磁盘中
当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用

undo log 原子性

回滚日志,用于记录数据被修改前的信息:提供回滚和MCVV(多版本并发控制)
undo log 和redo log记录物理日志不一样,他是逻辑日志。当delete一条记录时,undo log 中会记录一条对应的insert 记录
反之,当update 一条记录时,他记录一条对应相反的update记录。当执行rollback时,就可以从undo log 中的逻辑记录读取到相应的内容并进行回滚

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log 这些日志可能用于MVCC
Undo log存储 undo log 才用段的方式进行管理和记录,存放前面介绍的rollback segment回滚断种,内部包含1024个undo log segment

MVCC

当前读
读取的是记录最新版本,读取时还要保证其他并发事务不能修改当前记录,灰度读取的记录进行加锁。
对于日常操作如 select … lock in share mode select …for update ,update ,insert delete排它锁 都是一种当前读

快照读
简单的select 不加锁 就是快照读,快照读,读的记录数据的可见版本,有可能是历史数据,不加锁,非阻塞读
Read Committed 每次select 都生成一个快照读
Repeatable Read 开启事务后第一个select语句才是快照读的地方
Serizlizable 快照读会退化为当前读

MVCC
Multi-Version Concurrency Control 多版本并发控制。维护一个数据的多个版本,是的读写操作没有冲突,快照读为MySQL实现
MVCC提供一个非阻塞读功能 。 MVCC具体实现还依赖于数据库记录中的三个隐式字段,dndo log 日志 read View
三个隐藏字段 DB _TRX_ID DB_ROLL_PTR DB_ROW_ID在构建表结构时候
DB _TRX_ID 最近修改事务的ID ,记录插入这条记录或最后一次修改该记录的事务ID
DB_ROLL_PTR 回滚指针 指向这条记录的上一个版本,用于配合undo log 指向上一个版本
DB_ROW_ID 隐藏主键, 如果表建构没有指定主键,将会生成该隐藏字段

undo log
回滚日志,在insert update delete的时候产生的便于数据回滚的日志
当insert的时候,产生的undo log 日志只在回滚时需要,在事务提交后,可被立即删除
而update, delete时,产生的undo log 日志不仅在回滚时需要,在快照读时也需要,不会立即删除

undo log 版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的记录,链表尾部是最早的旧记录

readview
ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)ID
ReadView包含了四个核心字段:
m_ids 当前活跃事务ID集合 min_trx_id 最小活跃事务ID max_trx_id 预分配职务ID 当前最大事务ID+1 (事务ID自增) creator_trx_id Read view创建者的事务ID

版本数据链访问规则 .trx_id == creator_trx_id ? 可以访问该版本 ——》成立说明数据时当前事务更改的
.trx_id < creator_trx_id ? 可以访问该版本 —— 》 成立,说明数据已经提交了
.trx_id > max_trx_id ? 不可以访问该版本 ——》成立,说明该事务是在ReadView生成后才开启
.min_trx_id <= trx_id <=.max_trx_id ? 日过trx_id 不在m_ids中是可以访问该版本的 说明数据以提交

不同的隔离级别,生成ReadView的时机不同:
READ COMMITTED 在事务中每一次执行快照读时生成READView
REPEATABLE READ 仅在事务中第一次执行快照读时生成ReadView 后续复用该ReadView

MySQL管理

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

常用工具
mysql 不是mysql服务 ,而是mysql客户端工具
mysql [option] [database]
-u --user = name 指定用户名-p ==password[=name] 指定密码 -h --host = name 指定服务器IP或域名 -p --port = port 联建端口 -e --execute=name 执行SQL并退出

-e可以在mysql客户端执行sql语句,而不用连接到MYSQL数据库在执行,对于一些批处理脚本,这方便
mysql -u root -p 123 45 db01 -e “select * from stu”;

mysqladmin
是一个执行管理操作的客户单程序,用于检查服务器的配置和当前状态,创建并删除数据库
帮助文档
mysqladmin --help

mysqlbinlog
由于服务器生成的二进制日志文件以二进制格式保存,所以想检查这些文本的文本格式,使用mysqlbinlog日志管理工具
mysqlbinlog [options] log-files1 log-files2…

mysqlshow 客户端对象查找工具,快速查找存才的数据库,表,列,索引
mysqlshow [options][db_name[table_name[col_name]]]
option:–count 显示数据库和表的统计信息(数据库,表可以不指定) --i 显示指定数据库或者指定表的状态信息

mysqldump 用于备份数据库或者不同数据库之间进行数据迁移。备份包含创建表和插入表的SQL语句
mysqldump [option] db_name [tables] mysqldump[options]–database/-B db1[db2,db3]
mysqldump[option] -all-databases/-A

mysqlimport/source 客户端数据导入工具,用于mysqldump -T后带出的文本文件
导txt文件
mysqlimport[option] db_name textfile[text file…]
导sql文件
source /root/xxxx.sql

笔记总结`

某网站的mysql数据库学习笔记

最后

以上就是高挑太阳为你收集整理的MySQL数据库学习笔记MySQL数据库学习笔记前言一、关系型数据库二、SQL语句DDL DML DQL DCL笔记总结`的全部内容,希望文章能够帮你解决MySQL数据库学习笔记MySQL数据库学习笔记前言一、关系型数据库二、SQL语句DDL DML DQL DCL笔记总结`所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部