热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

这知识我没见过MySQL服务演进

MySQL服务演进1概述当数据越来越多,且增长速度很快,尤其是并发量也越来越多时,单点的数据库会出现性能瓶颈,比如连接池

MySQL服务演进

1

概述

  • 当数据越来越多,且增长速度很快,尤其是并发量也越来越多时,单点的数据库会出现性能瓶颈,比如连接池连接数不够,很多请求处于阻塞状态,没有命中索引的查询非常耗时,物理存储也会压力倍增

  • 此时,需要对数据库进行优化,硬件层面,增加CPU、内存和存储空间在前期能解决一定的问题;

  • 更多的,需要通过软件层面来进行优化,包括:

  • SQL调优,如前面所讲,排查出慢查询,有针对性进行优化

  • 表结构优化,根据业务特性,只返回表中合理数据,或表根据业务拆分成多个表,另外,适当的冗余,也能减少join,提升查询性能

  • 读写分离,面向实际业务读多写少的实际情况,使用binlog同步实现一主多从多个数据库实例,提升性能

  • 分库分表,但数据量继续增加时,尤其是单表数据超大,比如超过500

2

业务演进...

  • 就像一个公司是从小到大,业务体量也是如此,一般的,一个业务系统正常演进如下:

  • 单业务系统--单数据库:此时,业务体量很小,数据库承载量充分并有富余

  • 多业务系统--单数据库:这个阶段,业务复杂度增大,会将复杂的业务系统拆分成很多子业务系统,数据库性能卓越,还能继续支持多业务系统

  • 多业务系统--多数据库:即按业务分库、业务量继续增大,数据库成为瓶颈,将数据库按每个业务系统单独划分独立的数据库,独立部署,增加各个系统的业务承载能力,整体业务的承载能力也增强,微服务的处理模式就是这样

  • 分库分表:业务进入持续快速增长,某些业务子系统的单个或多个业务表数据量超限,通过硬件提升、单表的SQL优化、甚至时读写分离,都不能有效提高查询或操作的性能,就需要使用分表处理了;主要有垂直分表和水平分表,垂直分表是按业务特性,单表只存放与业务相关的字段;当数据量达到足够大时,如超过500万条记录,垂直分表性能提升有限,最终还是要使用分库的水平分表

  • 垂直分表:按业务拆分成多个表结构,使表结构更聚焦于业务,减少查询返回数据量

  • 水平分表:表结构相同,基于不同维度划分数据,数据不相同;又分单库分表和多库分表,由于单库始终会有性能瓶颈,所以常见为多库分表

业务演进过程

1

单应用-单DB

  • 小型项目的常见业务形态

2

多应用-单DB

  • 企业具备多种小项目常见的业务形态,数据库服务需要性能相对较好

3

单应用-主从DB

  • 中型复杂业务系统常见的模式,将业务中的读操作、写操作针对不同的DB服务器,提升业务系统容量

  • 主、从DB服务器要有合理的数据同步机制

  • 可以直接业务中切换,也可以使用中间件

4

多应用-多DB

  • 从业务的角度将应用、DB都做切分,切分成粒度更小的多个应用+DB组合

  • 微服务就是典型的多应用-多DB的模式

5

分库分表

  • 当应用体量越来越大,部分业务的单表数据超大,如超过1000万条,此时要考虑分库分表

  • 分库分表给应用带来了很大的复杂性,一般会使用像MyCat、ShardingSphere等中间件来处理,给业务屏蔽DB的复杂性

►►►

如何分表?

  • 实现分表,核心的就是根据业务找到一个合理的分表键,一般要考虑几个条件:

  • 数据能尽量均匀的分布在不同的库或表,并考虑业务增长的特性

  • 跨度查询,尤其是跨库join查询尽量少

  • 该分表键尽量不会变动

  • 常用的分表键划分(分区)策略有按范围、hash、hash+范围等


分表带来的问题

  • 跨库关联查询,如果在单库,可以方便的使用join获取关联信息、生成需要的业务报表,但分表后可能join的数据在另外一个库中;一般使用适当冗余数据、所有库都存放全局表、使用集中数据仓库处理汇总业务,以及在业务层组装等解决

  • 分布式事务,一个库中事务好处理,跨库、跨业务的事务比较复杂;可考虑在业务层面上使用消息中间件,以及一些第三方组件Seata、TXLcn等使用两阶段提交方式处理

  • 排序、分页、汇总等函数计算问题,需要分库计算、然后汇总,或是使用第三方组件

  • 分布式ID,分库分表后,原有的表主键使用方式(如自增)可能会出现问题,主要解决方式有:UUID、号段模式、Redis缓存、雪花算法(SnowFlake)


第三方插件和中间件

  • 分库分表后,业务系统中实现对多个数据源的数据操作实际很复杂

  • 有业界的第三方插件或中间件来解决前述分库分表带来的问题


  • ShardingSphere:Apache的开源的一个项目,需要嵌入到业务系统代码中进行处理,有基于Spring Boot的工具,对代码有侵入

  • MyCat:是在业务系统与分库分表多数据源中间架设一个中间层来实现,对代码无侵入




 福利

 


推荐阅读
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
小明爱微笑_401
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有