Mysql优化-全面详解(学习总结---从入门到深化)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 在程序的运行过程中,我们会发现这样的一个现象,随着程序运行 时间的不断推移以及数据量越来越大,程序响应的时间逐渐变慢, 程序变得卡顿,但最开始的时候并不是这样的,那是什么原因导致 的呢?

Sql性能下降的原因

2345_image_file_copy_587.jpg

在程序的运行过程中,我们会发现这样的一个现象,随着程序运行 时间的不断推移以及数据量越来越大,程序响应的时间逐渐变慢, 程序变得卡顿,但最开始的时候并不是这样的,那是什么原因导致 的呢?

性能下降的原因

2345_image_file_copy_588.jpg

sql性能下降的原因有哪些?

1、索引失效

2、服务器性能不足

3、sql编写不合理

Sql读取顺序

2345_image_file_copy_589.jpg

我们在编写sql代码时的顺序和Mysql内部读取sql时的顺序是不一样 的,因此有必要搞清楚Mysql读取sql语句的顺序。

2345_image_file_copy_590.jpg

整体过程

先对多表进行关联,根据条件找出符合的记录

在符合的记录基础上进行where条件过滤

对筛选出的记录进行分组操作

分组完成后再进行having操作,过滤出满足条件的数据

对取出的记录进行排序

再按照分页条件取出要显示的数据

1.下面关于sql读取顺序正确的是?from->where->group by->select->order by->limit

explain执行计划

2345_image_file_copy_591.jpg

Mysql 使用 explain 关键字可以模拟优化器执行 sql 语句,我们就 能够知道 Mysql 会如何处理sql,可以根据 explain 的分析结果和 Mysql 底层数据结构优化 sql。不同Mysql 版本可能有差别,但差别 不会很大。

执行示例:

EXPLAIN SELECT hco.co_id,hco.patient_name FROM
his_care_order hco LEFT JOIN
his_care_order_item hcoi ON hco.co_id =
hcoi.co_id

2345_image_file_copy_592.jpg

2345_image_file_copy_593.jpg

1、 id:select查询的序号,表示执行select操作时表的顺序。 id相同按顺序走

EXPLAIN SELECT * FROM `his_care_order` o
,`his_care_order_item` i WHERE
o.co_id=i.co_id

id不同,序号大的先执行

EXPLAIN SELECT * FROM `his_care_order` o
WHERE co_id=(SELECT co_id FROM
(SELECT co_id FROM `his_care_order_item`
WHERE item_id='ITEM1465223982444838912')T )

id相同,不同同时存在

EXPLAIN SELECT * FROM sys_dept d,(SELECT
dept_id FROM sys_user GROUP BY dept_id)t
WHERE t.dept_id=d.dept_id

2、select_type

查询类型,主要用于区别普通查询、联合查询、子查询 simple:简单select查询,查询中不包含子查询或union;

SELECT * FROM `his_care_order`

PRIMARY:主键查询

SELECT * FROM `his_care_order`
WHERE co_id=(SELECT co_id FROM
`his_care_order_item` WHERE
item_id='ITEM1465859053631700992')

SUBQUERY:where条件包含了子查询

EXPLAIN SELECT * FROM `his_care_order`
WHERE co_id=(SELECT co_id FROM
`his_care_order_item` WHERE
item_id='ITEM1465859053631700992')

DERIVED:from的表中包含子查询,被标记为derived(衍 生),把子查询的结果放在临时表中

SELECT * FROM `his_care_order` a,(SELECT
co_id FROM `his_care_order_item`  GROUP BY
co_id)b
WHERE a.co_id=b.co_id

1、table

显示这一行的数据是来自于哪张表的

2、partitions

如果查询是基于分区的话,会显示查询访问的分区

3、type

访问类型,按性能从低到高依次排列为

ALL:全表扫描,一定要优化

index:它和All都是扫描全表,但index是从索引中读取表,All 是从硬盘中读取

range:只检索给定范围的行,key列显示使用了哪个索引, between and或in等查询

ref:非唯一性索引扫描,本质上也是一种索引访问

eq-ref:唯一性索引扫描,对于每个索引键只有一条记录与之匹 配

const:通过索引一次就找到了,常见于primary或unique索引 查找

system:表中只有一行记录(系统表),很少出现 NULL:不需要访问表

4、possible_keys:

显示可能应用在这张表中的索引,一个或多 个,查询涉及的字段上若建立了索引则会列出来,但不一定被使用

5、key:

它和possible_keys的关系,理论上应该用到哪些索引,实 际上用到了哪些索引

6、key_len:

索引使用的字节数,key_len显示的值为索引字段的最 大可能长度

7、ref:

索引是否被引用到,用到了哪几个索引

8、rows:

根据表统计信息及索引使用情况,估算所需读取的记录 行数

9、filtered:

满足查询条件记录数量的比例,是百分比,不是具体 的记录数,这个值越大越好,它依赖于统计信息,并不是很准确

10、Extra:

Using filesort(文件排序,表示mysql无法利用索引完 成排序操作)

Using temporary(使用了临时表保存中间结果,常见 于order by和group by)

Using index(如果同时出现Using where,表明索引用 来执行索引键值的查 找,如果没有出现Using where,表 明索引用来读取数据而非执行查找)

Using where(使用了where过滤)

Using join buffer(使用了连接缓存)

impossible where(where子句的值总是false,不能用 来获取记录)

1.下面关于explain命令中id列的说法错误的是? id列是按正序排列的

2.下面关于explain命令中type列的说法正确的是?

2.1 type列包含ALL, index, range, ref, eq_ref, const, system, NULL等多种类型

2.2 按性能,All最差,NULL最高

2.3 在实际开发中至少要达到range



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
6月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
278 0
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
526 6
|
3月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
90 1
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
201 6
|
4月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
233 6
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
108 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
121 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
97 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
168 0
|
5月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
151 2

推荐镜像

更多