MYSQL调优课题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MYSQL调优课题

1 msyql的执行过程

image.png

mysql缓存

a. 查看缓存的配置项
SHOW VARIABLES LIKE '%query_cache%';

image.png

query_cache_type | OFF 关闭缓存

MySQL缓存是默认关闭的,也就是说不推荐使用缓存,并且在MySQL8.0 版本已经将查询缓存的整块功能删掉了。这主要是它的使用场景限制造成的:
先说下缓存中数据存储格式:key(sql语句)- value(数据值),所以如果SQL语句(key)只要存在一点不同之处就会直接进行数据库查询了;
由于表中的数据不是一成不变的,大多数是经常变化的,而当数据库中的数据变化了,那么相应的与此表相关的缓存数据就需要移除掉;

b. sql解析器
sql解析器报错
image.png

c. 查询优化器

select * from province inner join city on city.fid = province.id where province.id = 1;
先查哪一个表由优化器指定

2 查询排序

explain select * from
s1 where id > 100 order by id limit 1000;

image.png

Extra 字段中是包含 Using filesort 说明sql需要再排序

image.png

3 连表查询

Index Nested-Loop JoinSimple Nested-Loop JoinBlock Nested-Loop Join

a. Index Nested-Loop Join
翻译过来的意思是:索引循环嵌套链接,简称 INLJ。它是基于索引的链接算法

explain
SELECT * FROM test_joinv1 STRAIGHT_JOIN test_joinv2 ON (test_joinv1.m = test_joinv2.m)

image.png

image.png

image.png

这是使用索引的情况下,如果不使用索引查询就会很慢了,因为要扫描全表,但是真的扫描全表了吗?继续看

b. Simple Nested-Loop Join
简单嵌套循环链接,简称 SNLJ。这个算法没有做任何优化,每一次查询都会扫描链接的所有表,性能低下

SELECT * FROM test_joinv1 STRAIGHT_JOIN test_joinv2 ON (test_joinv1.m = test_joinv2.n)

image.png

执行计划里面显示使用了Block Nested Loop

Block Nested Loop
缓存块嵌套循环链接,简称 BNLJ。这种算法是使用缓存块将所有的数据在内存中进行比较(主要是内存的速度非常快),其核心是利用内存的空间换取时间
也即是在内容中计算,如果内存不足就循环扫描表加入内存,扫描次数增加查询也会变慢,所以大数据量还是会慢

4 索引

使用or,关于组合索引,我的以往工作中使用过一次组合索引,在一个很奇葩的现象中

explain select * from test_joinv1 where m =12 or id =0

image.png

唯一索引和普通索引的区别
在B+树里面,普通索引会一直找,唯一索引找到了就返回了

5 事务

redo日志是物理日志,undo日志是逻辑日志
image.png

6 锁

全局锁 flush tables with read lock;数据迁移时使用

表锁 lock tables [tableName] read/write

行锁

共享锁 lock in share mode 共享锁的使用场景是保证数据库中数据与数据之间的关系

共享锁的主要功能是:在某个事务中某条数据只要加上了共享锁,那么对于其他的事务来说该条数据将可读但是无法修改
场景主要用于后面插入的数据以来前面的数据

select * from test_joinv1 where id =1 lock in share mode

image.png
这时候在另一个会话中查询时没有问题的,但是删除和修改时不行的

image.png
加上共享锁后,另一个会话执行删除,那么他就要等待,这个等待时间mysql时可以修改的,语句SET GLOBAL innodb_lock_wait_timeout=100,有时候方法执行缓慢的原因很可能就是由于锁导致的

排他锁 for update

在一个事务中一个更新的操作会自动添加排他锁

begin;
update test_joinv1 set m=192199433 where id = 3;
commit

image.png

行锁升级为表锁
begin;
update test_joinv1 set m=192199433 where n = 3;

image.png

行锁锁的其实时索引,更新的条件没有家索引,那么行锁就变成了表锁,影响了性能

死锁

image.png

查询一条数据有时慢有时快的原因
正常我们把数据放入buffer pool如果buffer pool满了就要进行写入磁盘io,就会依赖磁盘的io速度,可以通过调整 innodb_io_capacity 参数的方式来避免

7 事务隔离级别

幻读

update test set b = 11 where b = 10;
update test set b = 10 where b = 80;
insert into test values (100,100,10);
间隙锁 锁定某一个范围,这个范围中的数据全部都归该锁控制,以至于其他事务无法操作相关范围的数据
MySQL 不仅会锁定 b=10的相关数据,还会锁定相关的  7 区间,此时如果你想修改相关数据和新增相关的数据时,都是阻塞状态。
(-∞, 10]、(10, 20]、(10, 30]、(10, 40]、(10, 50]、(10, 60] 以及 (60, +∞)

8 主从复制

show slave status 查看是否开启主从

image.png

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
12月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
601 66
|
7月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
7月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
8月前
|
SQL 负载均衡 关系型数据库
MySQL复制以及调优
本文介绍了MySQL自带复制方案的实现及其注意事项。复制方案能提供数据备份、负载均衡与分布式数据管理的优势。文章详细描述了复制步骤:主库(master)记录更改到二进制日志,发送同步消息给从库(slave),从库接收后将日志复制到本地并执行。实现复制包括配置主库的server-id和二进制日志、创建复制账号、初始化主库数据、设置从库参数及开启复制。此外,还探讨了三种日志格式(row、statement、mixed)的特点及选择建议,并分析了主从复制延迟的优化方法,如控制事务大小、优化日志传输和多线程还原日志等。最后,文中列出了搭建过程中需要注意的关键点。
148 3
|
SQL 算法 关系型数据库
【MySQL】专栏合集,从基础概念到调优
【MySQL】专栏合集,从基础概念到调优
139 0
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1599 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1136 1
|
存储 缓存 关系型数据库
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
|
关系型数据库 MySQL Java
面试官:说说MySQL调优?
面试官:说说MySQL调优?
215 5
面试官:说说MySQL调优?
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
1029 0

推荐镜像

更多