MySQL调优

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL调优调优的目的?让吞吐量更大,响应速度更快。

MySQL调优

网络异常,图片无法展示
|

调优的目的?让吞吐量更大,响应速度更快。

关于数据库优化,我们从以下5个维度进行。

一.优化表结构

表结构尽量遵循三范式的原则,在进行多表查询的时候,必要时可以采用反范式化进行优化。

什么叫范式?

  • 在关系型数据库中,关于数据表设计的基本原则,规则就称为范式。

一共有6大范式,知道前5个就行。满足了高级范式,就一定满足低级范式。比如满足第三范式,就一定满足第1,2范式。

  • 第一范式:确保每一个字段保证"原子性",不能被拆分。比如有一个字段叫"个人信息",它就可以拆分为地址,年龄,姓名等。就不满足第一范式
  • 第二范式:确保表中的每一条记录,都有唯一的标识(主键)。所有的非主键字段,必须完全依赖主键。不能部分依赖。
    注意:这里的主键是联合主键。比如下图:姓名,年龄依赖球员编号;比赛时间,比赛场地依赖比赛编号;只有得分全部依赖

  • 第三范式:确保非主键之间是相互独立的,不能产生依赖。下图就不满足

  • 巴斯范式(BCNF):3NF的增强版,在3NF的基础上消除了主属性对候选键的部分依赖或者传递依赖的关系。相当于主键中也产生了依赖关系,就不满足巴斯范式。比如下图

  • 第四范式:一个表中只有一对1:多的关系。如果一个表中有多个1:多的关系就不满足第四范式。

  • 第五范式:也叫完美范式,了解有这么个东西就行

范式的优缺点?

  • 优点:消除数据冗余
  • 缺点:降低查询效率,因为范式越高,设计出来的数据表就越多,就需要很多的关联查询。

反范式化?

  • 是一种空间换时间的优化手段。因为我们遵循业务优先原则,可以通过在表中增加冗余字段来提高数据库的读性能。
  • 当冗余信息有价值或者能大幅度提高查询效率的时候,我们才会采用反范式化进行优化。

 

数据库的设计原则?三少一多

  • 数据表的个数越少越好
  • 数据表中的字段个数越少越好
  • 数据表中联合主键的字段个数越少越好
  • 使用主键和外键越多越好。这里是指外键关系越多,就可以重复的利用数据,而不是指在表中建立好多外键。

数据库表建模的工具?

  • PowerDesigner

二.优化逻辑查询

关联查询优化:最好"被驱动表加索引"

  • 外连接:一般驱动表是全表查询(就算添加索引也是index),被驱动表是索引查询。(也就是说最好给被驱动表添加索引,驱动表加不加都行)
  • 如:student是驱动表,book是被驱动表   :EXPLAIN SELECT * FROM student LEFT JOIN book ON student.card = book.card;
  • 内连接:谁是驱动表谁是被驱动表由优化器决定,优化器满足"小表驱动大表"。(2个都加索引,让优化器自己决定;如果只加 一个索引,优化器肯定选择加索引的作为被驱动表)

优化器中join 的原理?

  • 不加索引
  • Simple Nested-Loop Join(简单嵌套循环连接)

  • Block Nested-Loop Join(块嵌套循环连接):不再逐条获取驱动表的数据,而是一块一块的获取,引入join buffer缓存区

  • Hash Join:MySQL8.0之后默认使用hash join。可以做大数据集连接。
  • 加索引
  • Index Nested-Loop Join(索引嵌套循环连接)

 

子查询优化:

  • 子查询执行效率不高,使用关联查询(join)代替子查询。
  • 效率不高的原因:
  • 查询的过程中需要建立一个临时表,查询完毕,再撤销临时表。消耗性能
  • 临时表都不会使用索引

排序优化:

  • 前提知识:MySQL支持2中排序方式,所以优化也是从这俩方面考虑
  • index排序:b+树的叶子节点就是按照排序进行的,使用索引直接就可以保证有序性
  • FileSort排序:将需要排序的数据加载到内存中,然后进行排序。
  • 尽量使用索引完成order by排序。如果where 和order by 后面的列相同就用单索引,不同就用联合索引。
  • 对FileSort进行调优
  • 前提知识:FileSort有2种算法
  • 双路排序(慢):进行俩次磁盘扫描,第一次只加载需要排序的列到sort_buffer,进行排序。然后根据排序好的列,第二次从磁盘读取其他的列。
  • 单路排序(快):一次性将所有列的数据加载到sort_buffer中,进行排序。
  • 提高sort_buffer_size:不管哪种算法,提高这个内存值肯定加大效率。
  • 提高max_length_for_sort_data:这个参数就是一个界限,需要返回的列总长度大于这个值就使用双路,小于这个值就使用单路。

group by优化:

  • group by 优化的方法和order by一样。

分页查询优化:

  • 如果像下图查询的情况极端,尽量的使用表中其他字段的索引。

 

其他的优化

  • exists和in:小表驱动大表

  • count(*)和count(1)和count(具体字段)的效率
  • count(*)和count(1)没有本质区别,执行时间基本一样
  • count(具体字段)的时候,尽量使用占用空间少的二级索引。因为二级索引存储的信息相比聚簇索引要少很多。count(*)和count(1) 系统会自动选择占用空间少的二级索引进行统计。
  • innodb的count()是O(n)级别的,MyISAM是O(1)级别的。
  • 关于select *
  • 尽量使用什么字段就指出来,不要使用select *。因为会加载很多没用的列。
  • 无法使用覆盖索引
  • 关于Limit 1:
  • 如果是全表扫描,加上Limit 1。找到数据就不会再继续查找了,加快查找效率
  • 如果是唯一索引,找到数据也不会继续查找了,Limit 1 就不管用了。

 

三.优化物理查询(索引)

  • 选择适合做索引的字段(MySQL索引讲)
  • 哪些情况导致索引失效(MySQL索引讲)
  • 使用覆盖索引:一个索引包含了满足查询结果的数据就叫做覆盖索引。(也就是需要的列恰好都在索引的叶子节点上存储,不需要回表)
  • 好处:无需回表;可以把随机IO变成顺序IO加快查询效率(利用到索引都是顺序IO,因为索引就是有顺序的)。
  • 使用索引下推:如图

  • 索引下推就用在一些and查询语句中,本来通过非聚集索引zipcode查询出来数据,要进行回表,但是如果查出来100条,分别对这100条进行回表就很浪费性能,icp就是先不进行回表,使用后面的条件进行过滤,过滤完毕之后比如剩下10条,对这10条进行回表就行了。
  • set optimizer_switch = 'index_condition_pushdown=on'     //开启索引下推

四.使用缓存

对于热点数据可以使用redis或者Memcached作为缓存,减少数据库的压力

转载地址https://www.cnblogs.com/monkey-xuan/p/15858689.html

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
610 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)的特点及选择建议,并分析了主从复制延迟的优化方法,如控制事务大小、优化日志传输和多线程还原日志等。最后,文中列出了搭建过程中需要注意的关键点。
154 3
|
SQL 算法 关系型数据库
【MySQL】专栏合集,从基础概念到调优
【MySQL】专栏合集,从基础概念到调优
143 0
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1630 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1145 1
|
存储 缓存 关系型数据库
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
【MySQL调优】如何进行MySQL调优?一篇文章就够了!
|
关系型数据库 MySQL Java
面试官:说说MySQL调优?
面试官:说说MySQL调优?
236 5
面试官:说说MySQL调优?
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
1049 0

推荐镜像

更多
下一篇
oss云网关配置