当前位置: 首页 > news >正文

【MySQL精通之路】优化

1 优化概述

        数据库性能取决于数据库级别的几个因素,如查询配置设置。这些软件结构导致了硬件级别的CPUI/O操作,您必须将其最小化并使其尽可能高效。

        在研究数据库性能时,首先要学习软件方面的高级规则指导原则,并使用挂钟时间测量性能。当你成为一名专家时,你会了解更多关于内部发生的事情,并开始测量CPU周期I/O操作等事情。

        典型用户的目标是从现有的软件和硬件配置中获得最佳的数据库性能。

        高级用户寻找机会来改进MySQL软件本身,或者开发自己的存储引擎硬件设备来扩展MySQL生态系统

2 数据库级别的优化

        基本的数据库设计是数据库快速运行的最重要因素:

2.1 表结构

        表格的结构是否正确?列是否具有正确的数据类型,每个表是否具有适合工作类型的列?

例如,执行频繁更新的应用程序通常有许多表,但列数很少,而分析大量数据的应用程序往往只有少数表,且列数很多。

2.2 索引

是否有适当的索引来提高查询效率?

2.3 存储引擎

您是否为每个表使用了适当的存储引擎,并利用了您使用的每个存储引擎的优势和功能?特别是,选择事务性存储引擎(如InnoDB)或非事务性存储发动机(如MyISAM)对性能和可扩展性非常重要。

注意:

InnoDB是默认存储引擎。在实践中,高级的InnoDB性能特性意味着InnoDB表通常优于更简单的MyISAM表,尤其是对于繁忙的数据库。

2.4 行格式

每个表格是否使用适当的行格式?此选项还取决于用于表的存储引擎。特别是,压缩表使用更少的磁盘空间,因此读取和写入数据所需的磁盘I/O更少。压缩可用于具有InnoDB表的各种工作负载,也可用于只读MyISAM表。

2.6 锁

应用程序是否使用了适当的锁策略?例如,在可能的情况下允许共享访问,以便数据库操作可以并发运行,并在适当的情况下请求独占访问,以便关键操作获得最高优先级。同样,存储引擎的选择意义重大。InnoDB存储引擎在没有您参与的情况下处理大多数锁问题,从而在数据库中实现更好的并发性,并减少代码的实验和调优量。

2.7 内存大小

用于缓存的所有内存区域的大小是否正确?也就是说,足够大,可以容纳频繁访问的数据,但不能太大,以至于物理内存过载并导致分页。要配置的主要内存区域是InnoDB缓冲池MyISAM的Key缓存

3 在硬件级别进行优化

        随着数据库变得越来越繁忙,任何数据库应用程序最终都会遇到硬件限制。DBA必须评估是否可以调整应用程序或重新配置服务器以避免这些瓶颈,或者是否需要更多的硬件资源。系统瓶颈通常来自以下来源:

3.1 磁盘

        磁盘查找。磁盘查找一段数据需要时间。对于现代磁盘,这一过程的平均时间通常低于10ms,因此理论上我们每秒可以进行大约100次搜索。这一时间随着新磁盘的使用而缓慢改善,并且很难针对单个表进行优化。优化寻道时间的方法是将数据分布到多个磁盘上。(磁盘阵列)

        磁盘读写。当磁盘处于正确的位置时,我们需要读取或写入数据。使用现代磁盘,一个磁盘至少可提供10–20MB/s的吞吐量。这比查找更容易优化,因为您可以从多个磁盘并行读取。

        CPU周期。当数据在主内存中时,我们必须对其进行处理才能得到结果。与内存量相比,拥有较大的表是最常见的限制因素。但对于小桌子,速度通常不是问题。

        内存带宽。当CPU需要的数据超过CPU缓存的容量时,主内存带宽就会成为瓶颈。对于大多数系统来说,这是一个不常见的瓶颈,但需要注意。

4.平衡便携性和性能

        要在可移植MySQL程序中使用面向性能的SQL扩展,可以将MySQL特定的关键字包装在

/*!*/内的语句中注释分隔符。其他SQL服务器会忽略注释的关键字

有关书面评论的信息,请参阅“注释”。

进入正文:

5.优化方案

5.1 优化SQL语句

【MySQL精通之路】SQL优化(1)-CSDN博客

5.2 优化索引

【MySQL精通之路】索引优化(2)-CSDN博客

5.3 优化数据库结构

5.3.1 优化数据大小
5.3.2 优化MySQL数据类型
5.3.3 针对多个表进行优化
5.3.4 MySQL中的内部临时表使用
5.3.5 数据库和表的数量限制
5.3.6 表格大小的限制
5.3.7 表列数和行大小的限制

5.4 优化InnoDB表

5.4.1 优化InnoDB表的存储布局
5.4.2 优化InnoDB事务管理
5.4.3 优化InnoDB只读事务
5.4.4 优化InnoDB重做日志
5.4.5 InnoDB表的批量数据加载
5.4.6 优化InnoDB查询
5.4.7 优化InnoDB DDL操作
5.4.8 优化InnoDB磁盘I/O
5.4.9 优化InnoDB配置变量
5.4.10 多表系统的InnoDB优化

5.5 针对MyISAM表进行优化

优化MyISAM查询
MyISAM表的批量数据加载
优化REPAIR TABLE语句

5.6 针对MEMORY表进行优化

5.7 了解查询执行计划

使用EXPLAIN优化查询
EXPLAIN输出格式
扩展EXPLAIN输出格式
获取命名连接的执行计划信息
估计查询性能

5.8 控制查询优化器

控制查询计划评估
可切换优化
优化器提示
索引提示
优化器成本模型
优化器统计信息

5.9 缓冲和缓存

InnoDB缓冲池优化
MyISAM密钥缓存
已准备语句和存储程序的缓存

5.10 优化锁定操作

内部锁定方法
表锁定问题
并发插入
元数据锁定
外部锁定

5.11 优化MySQL服务器

优化磁盘I/O
使用符号链接
优化内存使用

5.12 衡量绩效(基准)

测量表达式和函数的速度
使用自己的基准
用Performance_schema衡量性能

5.13 正在检查服务器线程(进程)信息

访问进程列表
线程命令值
常规线程状态
复制源线程状态
复制I/O(接收器)线程状态
复制SQL线程状态
复制连接线程状态
NDB群集线程状态
事件计划程序线程状态

相关文章:

  • 一千题,No.0037(组个最小数)
  • 2021职称继续教育--中国共产党的光辉历程及其经验
  • 服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程
  • nginx配置文件
  • 分布式事务-TCC
  • 锐捷网络与您相约第七届数字中国建设峰会 共话数字未来
  • RestTemplet 自定义消息转换器总结
  • 香港Web3媒体:Techub News
  • 动手学深度学习(Pytorch版)代码实践-深度学习基础-01基础函数的使用
  • 价值飙升30%,AI PC拉动半导体出货潮
  • 今日好料推荐(大数据湖体系规划)
  • Codeforces Round 947 (Div. 1 + Div. 2) D. Paint the Tree 题解 DFS
  • 轧钢测径仪分析软件,四大图表带来产线新视角!
  • 云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例
  • 数字营销:以大数据作引擎,推动企业全面数字化升级
  • 自己简单写的 事件订阅机制
  • HTTP中GET与POST的区别 99%的错误认识
  • learning koa2.x
  • Netty源码解析1-Buffer
  • PAT A1092
  • PHP 的 SAPI 是个什么东西
  • React组件设计模式(一)
  • swift基础之_对象 实例方法 对象方法。
  • Terraform入门 - 3. 变更基础设施
  • 回顾2016
  • 浏览器缓存机制分析
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 嵌入式文件系统
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原生Ajax
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Redis 入门到精通(七)-- redis 删除策略
  • ###项目技术发展史
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #考研#计算机文化知识1(局域网及网络互联)
  • #知识分享#笔记#学习方法
  • (1)Hilt的基本概念和使用
  • (145)光线追踪距离场柔和阴影
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (黑马点评)二、短信登录功能实现
  • (九)c52学习之旅-定时器
  • (十八)SpringBoot之发送QQ邮件
  • (四)图像的%2线性拉伸
  • (一)Docker基本介绍
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core中的去虚
  • .NET开发人员必知的八个网站
  • .NET企业级应用架构设计系列之结尾篇
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [145] 二叉树的后序遍历 js
  • [Android] 修改设备访问权限