MySQL高阶知识

网上学习整理,侵权请告知删除

MySQL中文文档:https://www.mysqlzh.com/

存储引擎

MyISAM和InnoDB区别
在这里插入图片描述

常见通用的Join查询

SQL的执行顺序

机读的顺序是从from开始
在这里插入图片描述
在这里插入图片描述

七种Join链接

内连接
在这里插入图片描述
在这里插入图片描述

左链接
在这里插入图片描述
在这里插入图片描述

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

右链接
在这里插入图片描述
在这里插入图片描述

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

全连接
在这里插入图片描述
mysql不支持FULL OUTER JOIN 语法
可以用union来代替
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引

索引介绍

索引(index)是帮助MySQL高效获取数据的一种数据结构
本质:索引是一种数据结构
索引的目的在于提高查询效率,可以类比字典
可以理解为排好序的快速查找数据结构
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。
在这里插入图片描述

索引示例:
在这里插入图片描述在这里插入图片描述
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
我们平常说的索引,如果没有特别指明,都是B树(多路搜索树,并不一定是二叉的)结构组织的索引,其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认都是使用B+树索引,统称索引。除了B+树索引之外还有哈希索引(hash index)等

索引优势

1、类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本
2、通过索引列队数据进行排序,降低数据排序的成本,降低了CPU的消耗

索引劣势

1、实际上索引也是一张表,该表保存了主键与索引字段,并指向实体引表的记录,所以索引列也是要占用空间的。
2、索引大大提高了查询数据,同时却会降低更新表的速度,如果对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因更新所带来的键值变化后的所有信息。

索引分类

单值索引: 一个索引只包含的单个列,一个表可以有多个单值索引。
唯一索引: 所有列的值必须唯一,但允许有空值。
复合索引: 一个索引包含多个列。
在这里插入图片描述
在这里插入图片描述

索引结构

BTree索引
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建索引的条件

哪些条件适合创建索引:
在这里插入图片描述
哪些条件不适合创建索引:
在这里插入图片描述
条件二的原因:
在这里插入图片描述

性能分析

mysql常见瓶颈
在这里插入图片描述

Explain

Explain是什么
在这里插入图片描述
Explain能干嘛
在这里插入图片描述

Explain怎么用:

1、Explain + SQL语句

2、执行计划包含的信息
在这里插入图片描述

id:

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

三种情况

  • id相同
    在这里插入图片描述

  • id不同
    在这里插入图片描述

  • id相同和不同,两种情况同时存在
    在这里插入图片描述
    在这里插入图片描述
    DERIVED:衍生
    derived2就是id为2查询后的衍生表

select_type:

主要用于区别普通查询、联合查询、子查询等的复杂查询。

类型
在这里插入图片描述
类型解释
在这里插入图片描述

table:

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

type:

访问类型排列
显示查询使用了何种类型
最好到最差依次是:
system > const > eq_ref > ref > range > index > ALL

在这里插入图片描述
在这里插入图片描述
一般来说,得保证查询至少达到range级别,最好能达到ref

possible_keys:

显示可能应用在这张表中的索引,一个或多个。
查询涉及到的字段上若存在索引,则改索引将被列出,但不一定被查询实际应用

key:

实际使用的索引,如果为null,则没有使用索引。
查询中若使用了覆盖索引,则该索引仅出现在key列表中
在这里插入图片描述

key_len:

在这里插入图片描述

ref:

显示索引的那一列被使用了,可能的话最好是一个常数。哪些列或常数被用于查找索引列上的值。

rows:

根据表统计信息及索引选用情况,大致估算出找到所需记录所需要读取的行数。

Extra:

包含不适合在其他列中显示但十分重要的额外信息。
1、Using filesort(读取数据慢)
在这里插入图片描述
2、Using temparory(读取数据慢)
在这里插入图片描述
3、Using index
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、Using where
表明使用了where过滤

5、Using Join buffer
使用了连接缓存

6、impossible where
where子句的值总是false,不能用来获取任何元组

7、select tables optimized away
在这里插入图片描述
8、distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

索引优化

单表查询优化
查询category_id为1且comments大于1,views查看最多的article
在这里插入图片描述
在这里插入图片描述
第一次创建索引优化
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
删除索引
在这里插入图片描述
重新创建索引
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双表查询优化
在这里插入图片描述
给book添加索引
在这里插入图片描述
优化结果
在这里插入图片描述
删除book表的索引
在这里插入图片描述
给class表添加索引
在这里插入图片描述
优化结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三表查询优化
在这里插入图片描述
未优化的结果
在这里插入图片描述
给phone表和book表添加索引
在这里插入图片描述
优化的结果
在这里插入图片描述

索引最好设置在经常需要查询的字段中

Join 优化
1、尽可能减少join语句中的嵌套循环的循环总次数;用小结果集驱动大的结果集
2、优先优化嵌套循环的内层循环
3、保证join语句中被驱动表上join条件字段已经被索引
4、当无法保证被驱动表的join条件字段被索引,且内存资源充足的条件下,不要太吝惜JoinBuffer的设置

避免索引失效

在这里插入图片描述
创建复合索引
在这里插入图片描述
索引失效案例
在这里插入图片描述
第二条
说明:如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列

案例:
在这里插入图片描述
第三条说明:

案例
在这里插入图片描述
第四条
说明:查询语句中索引使用了范围查询,则范围查询条件右边的索引全部失效。
索引使用了范围查询会进行排序,导致索引只使用了部分,
在这里插入图片描述
第五条:

案例
在这里插入图片描述
第六条:

案例
在这里插入图片描述

第七条:

案例
在这里插入图片描述
第八条:
说明:like百分号只写右边,否者索引失效
如果使用 %字符串% 查询,最好使用覆盖索引查询(查询的列是索引列),like查询也属于范围查询但是右边的索引不会失效
"%"代表匹配0个或多个任意字符。

案例
在这里插入图片描述

第九条:
说明:字符串类型条件查询不使用单引号,会导致mysql自动进行类型转换,从而导致索引失效。

第十条:

案例
在这里插入图片描述
总结
在这里插入图片描述
在这里插入图片描述

一般性建议

在这里插入图片描述

查询截取分析

优化步骤:
1、慢查询的开启并捕获。
2、explain + 慢SQL分析
3、show profile查询SQL在MySQL服务器里面执行细节和生命周期情况
4、SQL数据库服务器的参数调优

查询优化

永远小表驱动大表

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

ORDER BY关键字优化

案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
order by 子句尽量使用index方式排序,避免使用filesort方式排序
MySQL支持两种方式的排序,FileSort和Index,Index效率高,它指MySQL扫描索引本身完成排序。FileSort效率较低。

尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
Order By 满足两种情况,会使用index方式排序:
在这里插入图片描述

优化策略
在这里插入图片描述
在这里插入图片描述
总结
在这里插入图片描述

GROUP BY 关键字优化

group by实质是先排序后分组,遵循索引建的最佳左前缀

当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置

where高于having,能写在where的限定条件就不要到having限定

慢查询日志

作用

在这里插入图片描述

怎么使用

说明:
在这里插入图片描述
日志开启:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
设置慢的阙值时间:

set global long_query_time = 时间值(单位秒);

设置阙值后查看:
在这里插入图片描述
记录慢SQL并后续分析:
在这里插入图片描述
查询当前系统中有多少条慢查询记录

SHOW global status like '%Slow_queries%';

在这里插入图片描述

日志分析工具mysqldumpslow

查看mysqldumpslow帮助信息

linux使用命令 mysqldumpslow --help

在这里插入图片描述
常用命令:
在这里插入图片描述

Show Profile

介绍

是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优测量

默认情况下,参数处于关闭状态下,并保存最近15次的运行结果

分析步骤
1、是否支持,看看当前的mysql版本是否支持

show variables like ‘profiling’;

show variables like ‘profiling%’;
在这里插入图片描述

2、开启功能,默认是关闭,使用前开启

set profiling=on
在这里插入图片描述

3、运行SQL

执行SQL语句
在这里插入图片描述

4、查看结果,show profiles

在这里插入图片描述

5、诊断SQL,show profile cpu,block io for query 上一步前面的问题SQL数字号码(就是Query_ID)

在这里插入图片描述

show profile cpu,block io for query 3;
在这里插入图片描述

6、日常开发需要注意的结论

在这里插入图片描述

全局查询日志

永远不要在生产环境开启这个功能

配置启用

在这里插入图片描述

编码启用

在这里插入图片描述
select* from mysql.general_log
在这里插入图片描述

MySQL锁机制

概述

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

锁的分类
从对数据操作的类型(读\写)分

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会相互影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

从对数据操作的粒度分

表锁和行锁

三锁

表锁(偏读)
特点:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发最低。
案例:

在这里插入图片描述
在这里插入图片描述
加读锁
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加写锁
在这里插入图片描述
在这里插入图片描述

结论

在这里插入图片描述
简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞

表锁分析

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

行锁(偏写)
特点

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:
一是支持事务(TRANSACTION)
二是采用了行级锁

案例

建表SQL
在这里插入图片描述
行锁基本演示
在这里插入图片描述
无索引行锁变表锁

间隙锁危害
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结

在这里插入图片描述

行锁分析

show status like ‘innodb_row_lock%’;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优化建议

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。
合理设计索引,尽量缩小锁的范围。
尽可能较少索引条件,避免间隙锁。
尽量控制事务大小,减少锁定资源量和时间长度。
尽可能低级别事务隔离。

页锁

开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

主从复制

复制的基本原理

slave会从master读取binlog来进行数据同步

三步骤+原理图
在这里插入图片描述

复制的基本原则

每一个slave只有一个master
每一个slave只能有一个唯一的服务器ID
每个master可以有多个slave

复制的最大问题

延迟

一主一从常见配置

mysql版本一致且后台已服务运行
主从都配置在**[mysqld]**结点下,都是小写

主机修改my.ini配置文件
在这里插入图片描述
在这里插入图片描述
从机修改my.cnf配置文件
在这里插入图片描述

因修改过配置文件,请主机+从机都重启后台mysql服务
主机从机都关闭防火墙

linux关闭防火墙命令:service iptables stop

在windows主机上建立账户并授权slave

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

在Linux从机上配置需要复制的主机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可能遇到的问题
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值