尚硅谷MySQL高级(周阳)_xmind
2021-04-25 09:51:25 2 举报
AI智能生成
为你推荐
查看更多
整理精品
作者其他创作
大纲/内容
1mysql的架构介绍
Mysql简介
概述
高级MySQL
mysql内核
sql优化工程师
mysql服务器的优化
查询语句优化
主重复制
软硬件升级
容灾备份
sql编程
MysqlLinux版本的安装--mysql5.5
mysql5.5
下载地址
检查当前系统是否安装过mysql
安装mysql服务端(注意提示)
安装mysql客户端
查看Mysql安装时创建的mysql用户和mysql组
mysql服务的启+停
mysql服务启动后开始连接
首次连接成功
按照安装Service中的提示修改登录密码
自启动mysql服务
修改配置文件位置
修改字符集和数据存储路径
Mysql的安装位置
在linux下查看安装目录 ps -ef|grep mysql
Mysql配置文件
主要配置文件
二进制日志log-bin
错误日志log-error
查询日志log
数据文件
两系统
windows
D:\\ProgramFiles\\MySQL\\MySQLServer5.5\\data目录下可以挑选很多库
linux
看看当前系统中的全部库后再进去
默认路径:/var/lib/mysql
frm文件
存放表结构
myd文件
存放表数据
myi文件
存放表索引
如何配置
my.ini文件
Linux
/etc/my.cnf文件
Mysql逻辑架构介绍
总体概览
查询说明
Mysql存储引擎
查看命令
MyISAM和InnoDB
阿里巴巴,淘宝用哪个
2索引优化分析
性能下降SQL慢 执行时间长 等待时间长
查询语句写的烂
索引失效
单值
复合
关联查询太多join(设计缺陷或不得已的需求)
服务器调优及各个参数设置(缓冲\\线程数等)
常见通用的join查询
SQL执行顺序
手写
机读
总结
Join图
建表SQL
7种Join
索引简介
是什么
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高校获取数据的数据结构。可以得到索引的本质:索引是数据结构
你可以简单理解为\"排好序的快速查找数据结构\"。
详解(重要)
结论
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以文件形式存储在硬盘上
优势
类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗
劣势
索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立优秀的索引,或优化查询语句
mysql索引分类
单值索引
即一个索引只包含单个列,一个表可以有多个单列索引
唯一索引
索引列的值必须唯一,但允许有空值
复合索引
即一个索引包含多个列
基本语法
创建
CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON(columnname(length));
删除
DROP INDEX [indexName] ON mytable;
查看
SHOW INDEX FROM table_name\\G
使用ALTER命令
mysql索引结构
BTree索引
Hash索引
full-text全文索引
R-Tree索引
哪些情况需要创建索引
1.主键自动建立唯一索引
2.频繁作为查询的条件的字段应该创建索引
3.查询中与其他表关联的字段,外键关系建立索引
4.频繁更新的字段不适合创建索引
因为每次更新不单单是更新了记录还会更新索引,加重IO负担
5.Where条件里用不到的字段不创建索引
6.单间/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
7.查询中排序的字段,排序字段若通过索引去访问将大大提高排序的速度
8.查询中统计或者分组字段
哪些情况不要创建索引
1.表记录太少
2.经常增删改的表
3.数据重复且分布平均的表字段,因此应该只为经常查询和经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
性能分析
MySQL Query Optimizer
MySQL常见瓶颈
CPU:CPU在饱和的时候一般发生在数据装入在内存或从磁盘上读取数据时候
IO:磁盘I/O瓶颈发生在装入数据远大于内存容量时
Explain
是什么(查看执行计划)
使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈
官网介绍
能干嘛
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
怎么玩
Explain+SQL语句
执行计划包含的信息
分支主题
各个字段解释
id
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
三种情况
id相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id相同不同,同时存在
select_type
有哪些
查询的类型,主要用于区别普通查询、联合查询、子查询等的复杂查询
1.SIMPLE
简单的select查询,查询中不包含子查询或者UNION
2.PRIMARY
查询中若包含任何复杂的子部分,最外层查询则被标记为
3.SUBQUERY
在SELECT或者WHERE列表中包含了子查询
4.DERIVED
在FROM列表中包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询,把结果放在临时表里。
5.UNION
若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
6.UNION RESULT
从UNION表获取结果的SELECT
table
显示这一行的数据是关于哪张表的
type
访问类型排列
显示查询使用了何种类型从最好到最差依次是:systemconsteq_refrefrangeindexALL
system
表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计
const
表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键至于where列表中,MySQL就能将该查询转换为一个常量
eq_ref
唯一性索引,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描
ref
非唯一索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
range
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引一般就是在你的where语句中出现了between、、in等的查询这种范围扫描索引扫描比全表扫描要好,因为他只需要开始索引的某一点,而结束语另一点,不用扫描全部索引
index
all
备注:
一般来说,得保证查询只是达到range级别,最好达到ref
possible_keys
key
实际使用的索引。如果为null则没有使用索引
查询中若使用了覆盖索引,则索引和查询的select字段重叠
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好
key_len显示的值为索引最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
显示索引那一列被使用了,如果可能的话,是一个常数。那些列或常量被用于查找索引列上的值
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
Extra
包含不适合在其他列中显示但十分重要的额外信息
1.Using filesort
说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作成为“文件排序”
2.Using temporary
使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by 和分组查询 group by
3.USING index
覆盖索引(Covering Index)
4.Using where
表面使用了where过滤
5.using join buffer
使用了连接缓存
6.impossible where
where子句的值总是false,不能用来获取任何元组
7.select tables optimized away
在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
8.distinct
优化distinct,在找到第一匹配的元组后即停止找同样值的工作
热身Case
索引优化
索引分析
单表
案例
两表
三表
索引失效(应该避免)
案例(索引失效)
1.全值匹配我最爱
2.最佳左前缀法则
如果索引了多例,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4.存储引擎不能使用索引中范围条件右边的列
5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*
6.mysql在使用不等于(!=或者)的时候无法使用索引会导致全表扫描
8.like以通配符开头('$abc...')mysql索引失效会变成全表扫描操作
问题:解决like'%字符串%'索引不被使用的方法??
9.字符串不加单引号索引失效
11.小总结
面试题讲解
题目SQL
定值、范围还是排序,一般order by是给个范围
group by 基本上都需要进行排序,会有临时表产生
一般性建议
对于单键索引,尽量选择针对当前query过滤性更好的索引
在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
在选择组合索引的时候,尽量选择可以能包含当前query中的where子句中更多字段的索引
尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
3查询截取分析
查询优化
永远小表驱动大表类似嵌套循环Nested Loop
Case
order by关键字优化
ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
1
2
ORDER BY满足两情况,会使用Index方式排序
ORDER BY语句使用索引最左前列
使用where子句与OrderBy子句条件列组合满足索引最左前列
尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序
双路排序
MySQL4.1之前是使用双路排序,字面意思是两次扫描磁盘,最终得到数据。读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据传输
从磁盘取排序字段,在buffer进行排序,再从磁盘取其他字段。
取一批数据,要对磁盘进行两次扫描,众所周知,I\\O是很耗时的,所以在mysql4.1之后,出现了第二张改进的算法,就是单路排序。
单路排序
从磁盘读取查询需要的所有列,按照orderby列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据,并且把随机IO变成顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
结论及引申出的问题
由于单路是后出来的,总体而言好过双路
但是用单路有问题
优化策略
增大sort_buffer_size参数的设置
增大max_length_for_sort_data参数的设置
why
小总结
GROUP BY关键字优化
groupby实质是先排序后进行分组,遵照索引建的最佳左前缀
当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
慢查询日志
说明
查看是否开启及如何开启
默认
SHOW VARIABLES LIKE '%slow_query_log%'
开始
set global slow_query_log = 1
那么开启慢查询日志后,什么样的SQL参会记录到慢查询里面?
查看当前多少秒算慢
SHOW VARIABLES LIKE 'long_query_time%';
设置慢的阙值时间
set global long_query_time=3;
为什么设置后看不出变化?
需要重新连接或者新开一个回话才能看到修改值。SHOW VARIABLES LIKE 'long_query_time%';
show global variables like 'long_query_time';
记录慢SQL并后续分析
查询当前系统中有多少条慢查询记录
配置版
日志分析工具mysqldumpshow
查看mysqldumpshow的帮助信息
s:是表示按何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t:即为返回前面多少条的数据
g:后边搭配一个正则匹配模式,大小写不敏感的
工作常用参考
批量数据脚本
往表里插入1000W数据
1.建表
2.设置参数log_trust_function_createors
3创建函数保证每条数据都不同
随机产生字符串
随机产生部门编号
4.创建存储过程
创建往emp表中插入数据的存储过程
创建往dept表中插入数据的存储过程
5.调用存储过程
dept
emp
Show profiles
是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量
官网:http://dev.mysql.com/doc/refman/5.5/en/show-profile.html
默认情况下,参数处于关闭状态,并保存最近15次的运行结果
分析步骤
1.是否支持,看看当前的SQL版本是否支持
2.开启功能,默认是关闭,使用前需要开启
3.运行SQL
select * from emp group by id%10 limit 150000
select * from emp group by id%20 order by 5
4.查看结果,show profiles;
参数备注
6.日常开发需要注意的结论
converting HEAP to MyISAM 查询结果太大,内存都不够用了往磁盘上搬了。
Creating tmp table 创建临时表
拷贝数据到临时表
用完再删除
Copying to tmp table on disk 把内存中临时表复制到磁盘,危险!!!
locked
全局查询日志
配置启用
编码启用
永远不要在生产环境开启这个功能。
4Mysql锁机制
定义
生活购物
锁的分类
从数据操作的类型(读、写)分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
从对数据操作的颗粒度
表锁
行锁
三锁
表锁(偏读)
特点
偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低
案例分析
加读锁
加写锁
案例结论
表锁分析
行锁(偏写)
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
由于行锁支持事务,复习老知识
事务(Transation)及其ACID属性
并发事务处理带来的问题
更新丢失(Lost Update)
脏对(Dirty Reads)
不可重复读(Non-Repeatable Reads)
幻读(Phantom Reads)
事务隔离级别
行锁定基本演示
无索引行锁升级为表锁
间隙锁危害
面试题:常考如何锁定一行
行锁分析
优化建议
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围
尽可能较少检索条件,避免间隙锁
尽量控制事务大小,减少锁定资源量和时间长度
尽可能低级别事务隔离
页锁
开销和加锁时间界于表锁和行锁之间:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
了解一下即可
5主重复制
复制的基本原理
slave会从master读取binlog来进行数据同步
三步骤+原理图
master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志时间,binary log events
slave将master的binary log ebents拷贝到它的中继日志(relay log)
slave重做中继日志中的时间,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的
复制的基本原则
每个slave只有一个master
每个slave只能有一个唯一的服务器ID
每个master可以有多个salve
复制最大问题
延时
一主一从常见配置
mysql版本一致且后台以服务运行
主从都配置在【mysqld】结点下,都是小写
主机修改my.ini配置文件
1.【必须】主服务器唯一ID
server-id =1
2.【必须】启用二进制日志
log-bin=自己本地的路径/mysqlbin
3.【可选】启动错误日志
log-err=自己本地的路径/mysqlerr
log-err=D:/devSoft/MySQLServer5.5/data/mysqlerr
4.【可选】根目录
basedir=\"自己本地路径\"
basedir=\"D:/devSoft/MySQLService5.5/\"
5.【可选】临时目录
tmpdir=\"自己的本地路劲\"
tmpdir=\"D:/devSoft/MySQLService5.5/\"
6.【可选】数据目录
datadir=\"自己本地路径/Data/\"
datadir=\"D:/devSoft/MySQLService5.5/Data/\"
7.read-only=0
主机,读写都可以
8.【可选】设置不要复制的数据库
binlog-lgnore-db=mysql
9.【可选】设置需要复制的数据
binlog-do-db=需要复制的主数据库名字
从机修改my.cnf配置文件
【必须】从服务器唯一ID
【可选】启用二进制文件
因修改过配置文件,请主机+从机都启动后台mysql服务
主机从机都关闭防火墙
windows手动关闭
关闭虚拟机linux防火墙service iptables stop
在Windows主机上简历账户并授权slave
GRANT REPLICATION SLAVE ON*.* TO 'zhangsan'@'从机器数据库IP‘ IDENTIFIED BY '123456';
flush privileges;
查询master的状态
show master status;
记录下File和Position的值
执行完此步骤后不再执行主服务器MySQL,防止主服务器状态值变化
在Linux从机上配置需要复制的主机
启动从服务器复制功能
start slave;
show slave status\\G
下面两个参数都是YES,则说明主从配置成功!
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
主机新建库、新建表、insert记录,从机复制
如何停止从服务复制功能
stop slave;
Mysql笔记
0 条评论
回复 删除
下一页