【MySQL】sql调优基础

【Mysql】高级

image-20200714224928090

一、MySql介绍与安装

1.1 CentOS安装Mysql

image-20200715121017464 image-20200715123320750

1.2 修改默认配置文件

/usr/share/mysql/my-huge.cnf 文件即mysql的默认配置文件,为了不破坏这个文件,我们copy一份出来叫做 my.cnf

image-20200715122810904

修改字符集,编辑 my.cnf

image-20200715123756364 image-20200715124050289

注意:对于原来创建过的database,可能中文字符还会乱码,可以重新创建一个database

1.3 主要配置文件

image-20200715124442088
  1. 二进制日志文件 log-bin :主要用于主从复制

  2. 错误日志 log-erro :默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的信息等。

  3. 查询日志log : 默认关闭,记录查询的sql语句,开启后可能会降低mysql性能,因为记录日志也会消耗系统资源。

image-20200715130001680

1.4 MySQL 逻辑架构

  1. 总体概览
image-20200715131238361 image-20200715131410224

1.5 存储引擎

image-20200715131524652 image-20200715131832651

二、索引优化

image-20200715132009666

2.1 SQL慢问题

image-20200715132138903

索引:把我们经常查询的字段建立索引,这样在大量查询发生时可以提高查询的效率。

单值索引:

复合索引:

2.2 Join查询

image-20200715132933009 image-20200715133545640 image-20200715133249995 image-20200715134331737 image-20200715135613744

2.3 索引介绍

MySQL官方定义:索引index,是帮助MySQL高效获取数据的数据结构。索引是一种数据结构。

可以简单理解为“排好序的快速查找数据结构”。

image-20200715140124463 image-20200715141040495

结论:

数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据。这样就可以在这些数据结构的基础上实现高级查找算法。这种数据结构就是索引。

一般来说,索引也很多,通常会以索引文件形式存储在磁盘上。

平常我们说的索引,荣国没有特别指明,都是B树结构组织的索引,(多路索引搜索树,不一定是二叉索引)。

复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然除了,B树索引以外也有哈希索引。

image-20200715143157323

2.4 索引分类

image-20200715144312189

✔添加索引的语法

image-20200715144138894

2.5 索引结构

image-20200715164304256 image-20200715170345191 image-20200715172800575 image-20200715172902787 image-20200715173111218 image-20200715173305427

2.6 索引性能分析

image-20200715173624344

explain

查询出的性能分析结果含有如下字段

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Exetrs

image-20200715174410114 image-20200715180218024

id:

image-20200715180834515 image-20200715181000540 image-20200715181612180

select_type

image-20200715183005469 image-20200715183042963

type

image-20200715183434402 image-20200715185810549

possible_keys

显示可能用在这张表中的索引,可能有一个也可能有多个。

若这次查询中的字段中如果存在索引,则该索引将被列出来,但是该索引不一定被查询实际使用。

简言之:就是可能会被用到的索引。MySQL告诉用户这张表的本次查询理论上会用到哪些索引,key中是本次查询实际用的的所引。

实际被用到的索引由key

key

key_len

表示索引中使用的字节数,也就是查询中使用的索引的索引长度,在不损失精度的前提下,该值越小越好。

key_len 显示的值为索引字段的最大可能长度,而非实际使用长度。即key_len 是通过表定义计算而得出的,而不是通过检索实际值而得得。

image-20200715191406246

ref

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

简言之:索引到底有没有被充分使用,比如t1创建了索引,t1 创建了索引 idx_col1_col2, 该索引被 t2.col1检索时充分使用

所以 ref:shared.t2.col1 ,const

image-20200715192611367

rows

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

image-20200715193310482

Exetrs

十分重要的额外信息

image-20200715192512753 image-20200715194301197 image-20200715194620178 image-20200715194809805 image-20200715195359286 image-20200715195556683 image-20200715195745035

练习

image-20200715201207562

三、索引优化案例

3.1 单表优化案例:文章分类评论观看量

image-20200715203206062 image-20200715202415652 image-20200715202620446 image-20200715203126034

3.2 两表优化案例:class与book

book:id,card

class:id,card(card的数值表示所属的一个分类)

image-20200715204539708

3.3 三表优化案例:join的使用

image-20200715210303881 image-20200715210433169 image-20200715210050890

四、索引失效(避免)

4.1 索引失效的原因

image-20200715211236005

索引失效的可能原因:

image-20200716091111389 image-20200716091713556 image-20200716092601457 image-20200716093414363 image-20200716094532267 image-20200716094807331 image-20200716095035050 image-20200716095206953 image-20200716095506262 image-20200716100521601 image-20200716101212696 image-20200716102503681 image-20200716102641376

4.2 小总结

in、or、通配符、不等于、可以试试覆盖索引解决索引失效。

image-20200716102928867

4.3 面试题

image-20200716103155963 image-20200716103309298 image-20200716103701744 image-20200716104125271 image-20200716104609212 image-20200716104830656 image-20200716105013032 image-20200716105316678 image-20200716105548231 image-20200716105755526 image-20200716105927685 image-20200716110445332 image-20200716110923862 image-20200716113045284 image-20200716113226118

五、慢查询优化

5.1 小表驱动大表

in 与 exists

image-20200717133139299 image-20200717134210000

5.2 排序优化

order by

image-20200717134743824

第一步:建表,建索引

以前我们explain都是在测试有没有使用到索引、以及避免索引失效。

这次我们的关注点是 fileSort,它与 排序 order by又息息相关。

image-20200717135527601 image-20200717135623252 image-20200717135829698 image-20200717140049249 image-20200717140636466 image-20200717141131407 image-20200717143819956 image-20200717145154326

5.3 慢查询日志

image-20200717145601421 image-20200717145722902 image-20200717145944955 image-20200717150022083 image-20200717150336557 image-20200717150551646 image-20200717150727190 image-20200717160001967 image-20200717160123213 image-20200717160219393

mysqldumpslow:日志分析工具

image-20200717161002403 image-20200717160631183 image-20200717161019494

5.4 批量数据脚本

image-20200717161237320
  1. 修改配置参数,创建函数
image-20200717161938040

3. 创建函数

image-20200717162517758 image-20200717163029338
  1. 创建存储过程,往表中插入大量数据
image-20200717163808908 image-20200717163547001

5.调用存储过程

image-20200717164032873

5.5 show profile

开启profiling功能后,后台会开启自动抓取sql语句的执行情况,保存下来。

image-20200717164831547 image-20200717165048348 image-20200717165717557 image-20200717170132902 image-20200717170422470

全局查询日志

image-20200717171057799 image-20200717171016943 image-20200717171135088 image-20200717174445239

六、MySQL锁机制

6.1 概念

  1. 什么是锁
image-20200717175143556
  1. 锁分类

    对数据操作得类型分:

  • 读锁:共享锁

  • 写锁:排它锁

对锁得粗细粒度分

  • 表锁
  • 行锁
  • 页锁

6.2 表锁

image-20200717175744842 image-20200717175807715 image-20200717180042654 image-20200717180213061

读锁案例1

image-20200717181335611

写锁案例2

image-20200717182140857 image-20200717182401937

如何查看那些表被加锁,以及锁定得状况

image-20200717205927957 image-20200717210144359

6.3 行锁

image-20200717211122135 image-20200717211511835 image-20200717211632462 image-20200717211659739 image-20200717212251942 image-20200717213151863 image-20200717213335445 image-20200717215023531

6.4 间隙锁

image-20200717215502513 image-20200717215837698 image-20200717222058809

6.5 如何锁定一行

image-20200717223346322

6.6 小总结

image-20200717223549291 image-20200717223813091 image-20200717223904076 image-20200717224022233

6.7 页锁

image-20200717224044863

七、主从复制

image-20200717224257020 image-20200717224558042

7.1 一主一从配置

image-20200717225707797 image-20200717225751534 image-20200717225806974

猜你喜欢

转载自blog.csdn.net/qq_41864648/article/details/107535174
今日推荐