返回顶部
首页 > 资讯 > 数据库 >MySQL优化核心理论与实践
  • 596
分享到

MySQL优化核心理论与实践

2024-04-02 19:04:59 596人浏览 独家记忆
摘要

背景描述:朋友单位OA系统前不久完成升级大改造,后端用的Mysql存储数据,上线跑了个把月,抱怨电话开始接二连三打来,不是这里打不开,就是那里无响应,有人比喻升级后变成老爷车,越来越慢,问题迫在眉睫,必须马

背景描述:朋友单位OA系统前不久完成升级大改造,后端用的Mysql存储数据,上线跑了个把月,抱怨电话开始接二连三打来,不是这里打不开,就是那里无响应,有人比喻升级后变成老爷车,越来越慢,问题迫在眉睫,必须马上想对策呀。由于部署采用了规范文档,上线前也做了各种测试,于是乎,在线排查,未果,翻出实施文档,逐条阅读,未果,于是想起曾经一个业务系统,也碰到类似情况,后来通过各种优化得以缓解,遂有下文,《mysql优化核心理论与实践》。
说明:本文理论部分来源叶老师的博文,实践部分来源工作积累和众多热爱Mysql技术分享的网友,整理初衷是为了更加深入地理解MySQL优化,掌握更多MySQL优化方面的技术,提升自己,回馈热爱技术分享的所有网友。


硬件层的优化

新采购的服务器默认跑在节能模式下,在并发访问量很大的业务场景,会导致数据库性能跟不上,造成大量延迟,最终将拖垮业务系统。与此同时,磁盘选择与阵列卡设置不当也会使数据库性能成为整个业务系统的瓶颈。

目标一:全面关闭节能模式,让MySQL跑在高性能模式下

1.关闭CPU节能模式

找到OPI Link Speed Select选项,选择Max PerfORMance

2.关闭内存节能模式

找到Memory Speed选项,选择Max Performance
找到Power C-States选项,选择Disable
找到C1 Enhanced Mode选项,选择Disable

目标二:关闭NUMA,让CPU能始终高效地使用内存

关闭NUMA

找到Socket Interleave选项,选择Non-NUMA

目标三:全面提升ioPS性能,让磁盘I/O不再拖后退

1.资金充足时,采购SSD甚至PCIe-SSD

SSD和PCIe-SSD带来的不只是惊喜,更有踏实,从此磁盘I/O不再是恶魔

2.机械盘搭配阵列卡,Cache策略,BBU电池,RAID-10,15KRPM

阵列卡从容面对多块机械盘,BBU电池保障高性能模式下的Cache策略不丢数据
Cache策略选择Write Back甚至Always Write Back
阵列预读的Read Policy选项,选择Normal
使用RaiD-10,性能高于RAID-5
使用15KRPM高速磁盘,性能高于7.2KRPM磁盘

备注:服务器硬件设置的参数来源于IBM X3650M3


系统层的优化

操作系统方面也存在多处值得优化的地方,同样能明显提升IOPS性能。另外,SWAP要少用,不但不能救命,反而会让业务系统处于崩溃边缘。

目标一:全面提升IOPS性能,让数据库不再背锅

1.配置合理的I/O调度器

机械盘配deadline,执行命令echo deadline >/sys/block/sda/queue/scheduler
固态盘配noop,执行命令echo noop >/sys/block/sda/queue/scheduler
注意sda是数据文件所在分区

2.文件系统尽量使用XFS,假如还在使用ext4,希望只是过度阶段

3.mount参数增加noatime,nodiratime,nobarrier

vi /etc/fstab
/dev/sda1 /data xfs defaults,noatime,nodiratime,nobarrier 0 0
/dev/sda2 / xfs defaults,noatime,nodiratime,nobarrier 0 0
/dev/sda3 swap swap defaults,noatime,nodiratime,nobarrier 0 0
mount -o remount /data
mount

目标二:减少SWAP使用倾向甚至禁掉,稳定磁盘I/O和网络减少等待时间,让MySQL表现更加稳定

1.vm.swappiness设为5甚至0,假如不关心发生OOM

echo 'vm.swappiness = 5' >>/etc/sysctl.conf
/sbin/sysctl -p

2.vm.dirty_background_ratio设为5,vm.dirty_ratio设为10,让脏页持续刷入磁盘,避免磁盘I/O瞬间写产生TIME_WAIT

echo 'vm.dirty_background_ration = 5' >>/etc/sysctl.conf
echo 'vm.dirty_ratio = 10' >>/etc/sysctl.conf
/sbin/sysctl -p

3.net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tw_reuse设为双1,减少网络等待时间,提高效率

echo 'net.ipv4.tcp_tw_recycle = 1' >>/etc/sysctl.conf
echo 'net.ipv4.tcp_tw_reuse = 1' >>/etc/sysctl.conf
/sbin/sysctl -p

MySQL层的优化

选对MySQL版本尤为重要,找到适合业务系统的版本,才能发挥出更大性能。运行参数亦是如此,需要反复斟酌与调校。规范schema设计与sql编写,还有规范上线后的运维管理流程,同样也会带不小的收益。

目标一:选对版本,让MySQL起跑底气十足

1.优先推荐Oracle MySQL,越来越多的新上系统在拥抱官方5.7.x版本

2.其次推荐Percona分支版本,在这里能享受免费的thread pool和audit plugin

3.最后是MariaDB分支版本,除了线程池和审计插件,在这里能享受免费的黑科技

目标二:调校合适的参数,让MySQL的性能更加稳定

1.如果选择使用Percona或MariaDB分支版本,强烈推荐开启thread pool

2.设置default-storage-engine=innodb,innodb可以满足99%以上的业务场景

3.设置合适的innodb_buffer_pool_size大小,单实例多数是innodb表,建议设置物理内存的50%-70%

4.设置合适的innodb_flush_log_at_trx_commit和sync_binlog值

设置双1,不丢数据,性能较低
设置2和10,丢失一点数据,性能一般
设置双0,数据不×××全,性能最高

5.设置innodb_file_per_table = 1,使用独立表空间

6.设置innodb_data_file_path = ibdata1:1G:autoextend,在高并发事务时获得良好性能

7.设置innodb_log_file_size=256M,innodb_log_files_in_group=2

8.设置long_query_time = 0.05,记录超过50毫秒的慢SQL

9.适当调大max_connection,建议设置max_connection_error为10万以上,设置open_files_limit、innodb_open_files、table_open_cache、table_definition_cache约10倍于max_connection

10.不宜设置过大的参数tmp_table_size、max_heap_table_size、sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size

11.设置key_buffer_size = 32M,关闭query cache功能

关闭QC需要在启动MySQL前配置
query_cache_type = 0
query_cache_size = 0

目标三:Schema设计和SQL编写根据参考规范设定,有助于提高MySQL效率

1.所有innodb表都设计一个无业务用途的自增列做主键

2.字段类型在满足够用时,尽量选长度小的;字段属性尽量都加上NOT NULL约束

3.尽量不用TEXT和BLOB字段类型,一定需要时拆分至子表

4.查询时,尽量填写需要的列,不要查询所有列,避免严重随机读问题

5.一般varchar(n)列建索引是,取前50%长度即可

6.子查询处理时性能低,建议改使用JOIN改写SQL

7.多表连接查询时,关键字类型尽量一致,且都要有索引

8.多表连接查询时,把过滤后的结果集小的表作为驱动表

优势:不需要的数据不会出现,SQL查询范围小,执行效率高

9.多表连接查询并且有排序时,排序字段必须是驱动表里的,否则排序列不走索引

10.多用复合索引,少用多个独立索引,尤其是基数太小的列则不建议创建索引

11.使用分页功能的SQL时,选把关键字与主键做符合索引,再来执行,效率会高很多

目标四:管理维护的优化,让运维更高效

1.online DDL代价太高,机器性能足够时,建议单表物理不超过10G,单表行数不超过1亿,行平均长度不超过8KB

2.不出现OOM KILL和大量使用SWAP,不必担心MySQL进程占用过多内存

3.单实例运行中硬件资源还是比较紧张时,不要跑多实例

4.定期用pt-duplicate-key-checker检查和删除重复索引,定期用pt-index-usage检查和删除不太用的索引

5.定期采集slow query log,用pt-query-digest工具进行分析,再结合Anemometer等系统进行slow query管理,以便于分析和优化

6.可以使用pt-kill杀掉超长时间的SQL请求,Percona版本中有个选项 innodb_kill_idle_transaction也能实现该功能

7.可以使用pt-online-schema-change来完成大表的ONLINE DDL需求

8.定期使用pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差异

核心纲领:在上线之前,变更任何一个参数,都要做压力测试,避免漏网之鱼导致MySQL出现各种CRASH。

写在结尾:计划后期再对每个细节进行理论分析和压力测试,首次整理写作,可能有不完善之处,欢迎留言和交流。

强烈推荐两位实力派老师:叶金荣 和 吴炳锡

原文链接:
比较全面的MySQL优化参考(上篇)
比较全面的MySQL优化参考(下篇)

发表时间:2018年3月8日17时

您可能感兴趣的文档:

--结束END--

本文标题: MySQL优化核心理论与实践

本文链接: https://lsjlt.com/news/37877.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL优化核心理论与实践
    背景描述:朋友单位OA系统前不久完成升级大改造,后端用的MySQL存储数据,上线跑了个把月,抱怨电话开始接二连三打来,不是这里打不开,就是那里无响应,有人比喻升级后变成老爷车,越来越慢,问题迫在眉睫,必须马...
    99+
    2024-04-02
  • PHP 性能优化:从理论到实践
    php性能优化可通过以下步骤提升:优化数据库查询(使用索引、批量查询等);减少不必要的i/o操作(使用缓存工具);优化循环(使用高效循环如foreach);使用数组代替对象;避免方法调用...
    99+
    2024-05-10
    性能 php redis
  • MySQL核心参数优化文件my.ini实现
    目录一.数据库服务器配置二.CPU的优化三.内存的优化四.IO的优化五.连接的优化六.数据一致性的优化一.数据库服务器配置 CPU:48C内存:128GDISK:3.2TSSD 二.CPU的优化 innodb_threa...
    99+
    2023-01-31
    MySQL my.ini
  • Redis核心原理与实践之字符串实现原理
    本文分析Redis字符串的实现原理,内容摘自新书《Redis核心原理与实践》。这本书深入地分析了Redis常用特性的内部机制与实现方式,内容源自对Redis源码的分析,并从中总结出设...
    99+
    2024-04-02
  • PHP核心的设计模式与实践
    PHP核心的设计模式与实践引言:设计模式是软件开发中常用的解决问题的模板,它们提供了一种可重用的解决方案,可以帮助我们在开发过程中遵循最佳实践和良好的软件设计原则。PHP作为一种广泛应用的编程语言,也有许多常见和有用的设计模式可以在核心开发...
    99+
    2023-11-09
    PHP设计模式 PHP核心 核心实践
  • PHP核心的异常处理与日志记录实践
    标题:PHP核心的异常处理与日志记录实践在开发PHP应用程序时,异常处理和日志记录是非常重要的。异常处理可以帮助我们更好地处理运行时错误和异常情况,而日志记录则可以帮助我们跟踪和调试代码。本文将详细介绍如何在PHP应用程序中实现异常处理和日...
    99+
    2023-11-08
    异常处理 日志记录 PHP核心
  • PHP核心的多语言支持与实践
    PHP核心的多语言支持与实践随着全球化的发展,多语言支持成为了现代应用程序开发的重要需求。为了满足不同语言背景的用户,开发人员需要在应用程序中提供多语言支持,以便用户能够使用他们熟悉的语言进行交互。PHP作为一种流行的服务器端脚本语言,提供...
    99+
    2023-11-08
    PHP多语言支持 PHP核心语言特性 多语言实践
  • PHP核心的扩展开发实践与技巧
    PHP核心的扩展开发实践与技巧在PHP开发中,扩展是一种非常重要的技术手段。通过扩展,我们可以扩展PHP的功能,提高代码的运行效率,实现一些PHP无法实现的功能。本文将介绍PHP核心的扩展开发实践与技巧,并提供具体的代码示例。一、什么是PH...
    99+
    2023-11-08
    技巧 扩展开发 PHP核心
  • 理解Go语言内存优化的核心原则与方法
    Go语言内存优化的核心原则是尽量减少内存的分配和释放操作,以减少垃圾回收的压力和提高程序性能。以下是一些常见的方法和技巧:1. 使用...
    99+
    2023-10-08
    Golang
  • PHP gPRC 优化秘籍:从理论到实践,全面优化 gPRC 响应速度
    1. 消息编码优化 使用二进制编码: gRPC 默认使用 Protocol Buffers(Protobuf)二进制编码,比 JSON 等文本编码更紧凑、高效。 关闭压缩: 在网络带宽充足的情况下,可以关闭压缩,避免编码/解码造成的开...
    99+
    2024-02-19
    PHP gRPC 性能优化 消息编码 流控制 缓存
  • PHP 微服务容器化实践:从理论到实践
    php 微服务容器化实现了应用程序与底层系统的隔离,提高了安全性、可移植性和可扩展性。实战案例:创建一个 "hello-world" 微服务,使用 dockerfile 定义容器构建,并...
    99+
    2024-05-08
    php 容器化 docker apache
  • 最优化:建模、算法与理论(优化建模)
    最优化:建模、算法与理论 目前在学习 最优化:建模、算法与理论这本书,来此记录一下,顺便做一些笔记,在其中我也会加一些自己的理解,尽量写的不会那么的条条框框(当然最基础的还是要有) 第三章 优化建模 本章将从常用的建模技巧开始,接着介绍统计...
    99+
    2023-08-30
    算法
  • 如何理解网站内容优化是SEO优化的核心
    这期内容当中小编将会给大家带来有关如何理解网站内容优化是SEO优化的核心,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。SEO的主要工作是通过了解各类搜索引擎如何抓取互联网...
    99+
    2024-04-02
  • CodeReview方法论与实践总结梳理
    目录引言为什么要CR他山之石2.1 某大厂A2.1.1 代码评审准则2.1.2 代码评审原则2.1.3 代码审核者应该看什么2.2 某大厂B2.3 某大厂C我们怎么做 CR3.1 作...
    99+
    2023-02-07
    Code Review 方法论 Code Review
  • 解析Flink内核原理与实现核心抽象
    目录一、环境对象1.1 执行环境StreamExecutionEnvironmentLocalStreamEnvironmentRemoteStreamEnvironmentStre...
    99+
    2024-04-02
  • 技术分享 | MySQL 优化:JOIN 优化实践
    近期刚好学习了丁奇老师的《MySQL 实战 45 讲》中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记。 问题 SQL 描述 问题 SQL 和执行计划是这样的: exp...
    99+
    2015-01-09
    技术分享 | MySQL 优化:JOIN 优化实践
  • Discuz框架应用实践:优化论坛体验与提升用户参与度
    Discuz框架应用实践:优化论坛体验与提升用户参与度 随着网络的快速发展,论坛作为一个在线交流、分享和学习的平台,在网络社交中扮演着重要的角色。而Discuz框架作为优秀的论坛系统,...
    99+
    2024-03-14
    论坛 优化 参与
  • MySQL 原理与优化之Update 优化
    前言: 谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录。一般而言我们会使用innodb 的存储引擎,innodb引擎是基于行锁的,具体一点说是针对索引来加锁的(保证锁不...
    99+
    2022-08-14
    MySQL原理优化 MySQL Update优化
  • MySQL 索引优化实践(单表)
    目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引...
    99+
    2023-10-25
    mysql 数据库
  • Explain详解与索引优化实践
    为什么要用explain 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈 如何使用explain 下面是使用 explain 的例子: 在 s...
    99+
    2014-11-15
    Explain详解与索引优化实践
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作