广告
返回顶部
首页 > 资讯 > 数据库 >MySQL如何进行优化
  • 480
分享到

MySQL如何进行优化

2024-04-02 19:04:59 480人浏览 安东尼
摘要

这篇文章主要讲解了“Mysql如何进行优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql如何进行优化”吧! 案例背景案例分析Mysql

这篇文章主要讲解了“Mysql如何进行优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql如何进行优化”吧!

  •  案例背景

  • 案例分析

  • Mysql 主从结构

  • 案例解答

  • 总结

案例背景

假设你公司面临双 11 大促,投入了大量营销费用用于平台推广,这带来了巨大的流量,如果你是订单系统的技术负责人,要怎么应对突如其来的读写流量呢?

这是一个很典型的应用场景,我想很多研发工程师会回答:通过 Redis 作为 MySQL 的缓存,然后当用户查看“订单中心”时,通过查询订单缓存,帮助  MySQL 抗住大部分的查询请求。

应用缓存的原则之一是保证缓存命中率足够高,不然很多请求会穿透缓存,最终打到数据库上。然而在“订单中心”这样的场景中,每个用户的订单都不同,除非全量缓存数据库订单信息(又会带来架构的复杂度),不然缓存的命中率依旧很低。

所以在这种场景下,缓存只能作为数据库的前置保护机制,但是还会有很多流量打到数据库上,并且随着用户订单不断增多,请求到 MySQL  上的读写流量会越来越多,当单台 MySQL 支撑不了大量的并发请求时,该怎么办?

案例分析

互联网大部分系统的访问流量是读多写少,读写请求量的差距可能达到几个数量级,就好比你在京东上的商品的浏览量肯定远大于你的下单量。

所以你要考虑优化数据库来抗住高查询请求,首先要做的就是区分读写流量区,这样才方便针对读流量做单独扩展,这个过程就是流量的“读写分离”。

读写分离是提升 MySQL 并发的首选方案,因为当单台 MySQL 无法满足要求时,就只能用多个具有相同数据的 MySQL  实例组成的集群来承担大量的读写请求。

MySQL 主从结构

MySQL如何进行优化

MySQL 做读写分离的前提,是把 MySQL 集群拆分成“主 + 从”结构的数据集群,这样才能实现程序上的读写分离,并且 MySQL  集群的主库、从库的数据是通过主从复制实现同步的。

那么面试官会问你“MySQL 集群如何实现主从复制?” 换一种问法就是“当你提交一个事务到 MySQL 集群后,MySQL  都执行了哪些操作?”面试官往往会以该问题为切入点,挖掘你对 MySQL  集群主从复制原理的理解,然后再模拟一个业务场景,让你给出解决主从复制问题的架构设计方案。

所以,针对面试官的套路,你要做好以下的准备:

  • 掌握读多写少场景下的架构设计思路,知道缓存不能解决所有问题,“读写分离”是提升系统并发能力的重要手段。

  • 深入了解数据库的主从复制,掌握它的原理、问题,以及解决方案。

  • 从实践出发,做到技术的认知抽象,从方法论层面来看设计。

案例解答

MySQL 主从复制的原理无论是“MySQL 集群如何实现主从复制”还是“当你提交一个事务到 MySQL 集群后,MySQL  集群都执行了哪些操作?”面试官主要是问你:MySQL 的主从复制的过程是怎样的?

总的来讲,MySQL 的主从复制依赖于 binlog ,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上。复制的过程就是将 binlog  中的数据从主库传输到从库上。这个过程一般是异步的,也就是主库上执行事务操作的线程不会等待复制 binlog 的线程同步完成。

为了方便你记忆,我把 MySQL 集群的主从复制过程梳理成 3 个阶段。

  • 写入 Binlog:主库写 binlog 日志,提交事务,并更新本地存储数据。

  • 同步 Binlog:把 binlog 复制到所有从库上,每个从库把 binlog 写到暂存日志中。

  • 回放 Binlog:回放 binlog,并更新存储数据。

MySQL如何进行优化

但在面试中你不能简单地只讲这几个阶段,要尽可能详细地说明主库和从库的数据同步过程,为的是让面试官感受到你技术的扎实程度(详细过程如下)。

MySQL 主库在收到客户端提交事务的请求之后,会先写入  binlog,再提交事务,更新存储引擎中的数据,事务提交完成后,返回给客户端“操作成功”的响应。

从库会创建一个专门的 I/O 线程,连接主库的 log dump 线程,来接收主库的 binlog 日志,再把 binlog 信息写入 relay log  的中继日志里,再返回给主库“复制成功”的响应。

从库会创建一个用于回放 binlog 的线程,去读 relay log 中继日志,然后回放 binlog  更新存储引擎中的数据,最终实现主从的数据一致性。

在完成主从复制之后,你就可以在写数据时只写主库,在读数据时只读从库,这样即使写请求会表或者锁记录,也不会影响读请求的执行。

MySQL如何进行优化

同时,在读流量比较大时,你可以部署多个从库共同承担读流量,这就是“一主多从”的部署方式,你在垂直电商项目中可以用该方式抵御较高的并发读流量。另外,从库也可以作为一个备库,以避免主库故障导致的数据丢失。

MySQL 一主多从

当然,一旦你提及“一主多从”,面试官很容易设陷阱问你:那大促流量大时,是不是只要多增加几台从库,就可以抗住大促的并发读请求了?

当然不是。

因为从库数量增加,从库连接上来的 I/O 线程也比较多,主库也要创建同样多的 log dump  线程来处理复制的请求,对主库资源消耗比较高,同时还受限于主库的网络带宽。所以在实际使用中,一个主库一般跟 2~3 个从库(1 套数据库,1 主 2 从 1  备主),这就是一主多从的 MySQL 集群结构。

其实,你从 MySQL 主从复制过程也能发现,MySQL 默认是异步模式:MySQL 主库提交事务的线程并不会等待 binlog  同步到各从库,就返回客户端结果。这种模式一旦主库宕机,数据就会发生丢失。

而这时,面试官一般会追问你“MySQL 主从复制还有哪些模型?”主要有三种。

  • 同步复制:事务线程要等待所有从库的复制成功响应。

  • 异步复制:事务线程完全不等待从库的复制成功响应。

  • 半同步复制:MySQL 5.7  版本之后增加的一种复制方式,介于两者之间,事务线程不用等待所有的从库复制成功响应,只要一部分复制成功响应回来就行,比如一主二从的集群,只要数据成功复制到任意一个从库上,主库的事务线程就可以返回给客户端。

这种半同步复制的方式,兼顾了异步复制和同步复制的优点,即使出现主库宕机,至少还有一个从库有最新的数据,不存在数据丢失的风险。

讲到这儿,你基本掌握了 MySQL 主从复制的原理,但如果面试官想挖掘你的架构设计能力,还会从架构设计上考察你怎么解决 MySQL  主从复制延迟的问题,比如问你“在系统设计上有哪些方案可以解决主从复制的延迟问题?”

从架构上解决主从复制延迟

我们来结合实际案例设计一个主从复制延迟的解决方案。

在电商平台,每次用户发布商品评论时,都会先调用评论审核,目的是对用户发布的商品评论进行如言论监控、图片鉴黄等操作。

评论在更新完主库后,商品发布模块会异步调用审核模块,并把评论 ID 传递给审核模块,然后再由评论审核模块用评论 ID  查询从库中获取到完整的评论信息。此时如果主从数据库存在延迟,在从库中就会获取不到评论信息,整个流程就会出现异常。

MySQL如何进行优化

主从延迟影响评论读取的实时性

这是主从复制延迟导致的查询异常,解决思路有很多,我提供给你几个方案。

使用数据冗余

可以在异步调用审核模块时,不仅仅发送商品  ID,而是发送审核模块需要的所有评论信息,借此避免在从库中重新查询数据(这个方案简单易实现,推荐你选择)。但你要注意每次调用的参数大小,过大的消息会占用网络带宽和通信时间。

使用缓存解决

可以在写入数据主库的同时,把评论数据写到 Redis 缓存里,这样其他线程再获取评论信息时会优先查询缓存,也可以保证数据的一致性。

不过这种方式会带来缓存和数据库的一致性问题,比如两个线程同时更新数据,操作步骤如下:

MySQL如何进行优化

线程 A 先更新数据库为 100,此时线程 B 把数据库和缓存中的数据都更新成了 200,然后线程 A 又把缓存更新为 100,这样数据库中的值 200  和缓存中的值 100 就不一致了。

总的来说,通过缓存解决 MySQL 主从复制延迟时,会出现数据库与缓存数据不一致的情况。

直接查询主库

该方案在使用时一定要谨慎,你要提前明确查询的数据量不大,不然会出现主库写请求锁行,影响读请求的执行,最终对主库造成比较大的压力。

当然了,面试官除了从架构上考察你对 MySQL主从复制延迟的理解,还会问你一些扩展问题,比如:当 MySQL  做了主从分离后,对于数据库的使用方式就发生了变化,以前只需要使用一个数据库地址操作数据库,现在却要使用一个主库地址和多个从库地址,并且还要区分写入操作和查询操作,那从工程代码上设计,怎么实现主库和从库的数据访问呢?

实现主库和从库的数据库访问

一种简单的做法是:提前把所有数据源配置在工程中,每个数据源对应一个主库或者从库,然后改造代码,在代码逻辑中进行判断,将 SQL  语句发送给某一个指定的数据源来处理。

这个方案简单易实现,但 SQL 路由规则侵入代码逻辑,在复杂的工程中不利于代码的维护。

另一个做法是:独立部署的代理中间件,如 MyCat,这一类中间件部署在独立的服务器上,一般使用标准的 MySQL 通信协议,可以代理多个数据库。

该方案的优点是隔离底层数据库与上层应用的访问复杂度,比较适合有独立运维团队的公司选型;缺陷是所有的 SQL  语句都要跨两次网络传输,有一定的性能损耗,再就是运维中间件是一个专业且复杂的工作,需要一定的技术沉淀。

MySQL如何进行优化

总结

我们先从一个案例出发,了解了在互联网流量读多写少的情况下,需要通过“读写分离”提升系统的并发能力,又因为“读写分离”的前提是做  “主+从”的数据集群架构,所以我们又讲了主从复制的原理,以及怎么解决主从复制带来的延迟。

感谢各位的阅读,以上就是“MySQL如何进行优化”的内容了,经过本文的学习后,相信大家对MySQL如何进行优化这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL如何进行优化

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL如何进行优化
    这篇文章主要讲解了“MySQL如何进行优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL如何进行优化”吧! 案例背景案例分析MySQL ...
    99+
    2022-10-18
  • MySQL索引如何进行优化
    这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
    99+
    2022-10-19
  • 如何进行Mysql SSD下的MySQL IO 优化
    这篇文章给大家介绍如何进行Mysql SSD下的MySQL IO 优化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 背景 在阅读这篇文章之前,读者需要注意的是,为了维护隐...
    99+
    2022-10-18
  • 如何进行MySQL中的order by 优化
    这篇文章将为大家详细讲解有关如何进行MySQL中的order by 优化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一 前言...
    99+
    2022-10-19
  • 如何进行MySQL优化WHERE子句
    今天就跟大家聊聊有关如何进行MySQL优化WHERE子句,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 MyS...
    99+
    2022-10-19
  • mysql 优化中如何进行IN换INNER JOIN
    本篇文章给大家分享的是有关mysql 优化中如何进行IN换INNER JOIN,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。今天撸代码时,遇到...
    99+
    2022-10-18
  • mysql中如何进行联合索引优化
    今天就跟大家聊聊有关mysql中如何进行联合索引优化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  exp...
    99+
    2022-10-19
  • 如何在mysql中对查询进行优化
    本篇文章为大家展示了如何在mysql中对查询进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、优化方法(1)重新定义表的关联顺序(多张表关联查询时,并不一定按照SQL中指定的顺序进行,但有一...
    99+
    2023-06-15
  • 如何优化mysql行锁
    如何优化mysql行锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、优化方法尽可能让所有数据检索都通过索引来完成,避免无索引行或索引失效导致行锁升级为表锁。尽可能避免间...
    99+
    2023-06-15
  • MySQL百分位数计算如何进行优化
    小编给大家分享一下MySQL百分位数计算如何进行优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要是采用存储过程,在中间计算...
    99+
    2022-10-18
  • 如何进行SEO优化
    这篇文章将为大家详细讲解有关如何进行SEO优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SEO方案包括:1、网站SEO诊断先要给网站进行一个系统的SEO诊断,看看这个网站目前的优化情况到底是什么情况的...
    99+
    2023-06-10
  • mysql进行sql优化的方法
    小编给大家分享一下mysql进行sql优化的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql进行sql优化的方法:1...
    99+
    2022-10-18
  • MySQL数据库怎么进行优化
    这篇文章主要讲解了“MySQL数据库怎么进行优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库怎么进行优化”吧!  MySQL数据库怎么优化...
    99+
    2022-10-18
  • MYSQL的优化是怎样进行的
    本篇文章给大家分享的是有关MYSQL的优化是怎样进行的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.数据库的设计尽量把数据库设计的更小的占...
    99+
    2022-10-19
  • 怎么进行MySQL性能优化中的索引优化
    本篇文章为大家展示了怎么进行MySQL性能优化中的索引优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引...
    99+
    2022-10-19
  • 如何进行MySQL管理基础中的性能优化
    如何进行MySQL管理基础中的性能优化,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 1.索引<1&g...
    99+
    2022-10-19
  • MySQL怎么对表结构进行优化
    本篇内容介绍了“MySQL怎么对表结构进行优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   由于My...
    99+
    2022-10-18
  • 数据库如何进行优化
    这篇文章主要介绍了数据库如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据库优化的方式:1、选取最适用的字段属性;2、使用连接来代替子查询;3、使用联合来代替手动...
    99+
    2023-06-14
  • 网站如何进行SEO优化
    这篇文章将为大家详细讲解有关网站如何进行SEO优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  SEO方案全体框架:  竞争对手剖析: 在做SEO方案之前,先对竞争对手停止剖析,研讨,找出对手的劣势、...
    99+
    2023-06-10
  • js如何进行性能优化
    小编给大家分享一下js如何进行性能优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!循环处理是最常见的编程模式之一,也是提升性能...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作