• 11
  • 11
分享
  • MySQL大表优化方案——软件测试圈
  • 北极 2021-01-20 10:03:25 字数 3374 阅读 5822 收藏 11

背景

       阿里云RDS FOR MySQL(MySQL5.7版本)数据库业务表每月新增数据量超过千万,随着数据量持续增加,我们业务出现大表慢查询,在业务高峰期主业务表的慢查询需要几十秒严重影响业务

方案概述

1.png

一、数据库设计及索引优化

       MySQL数据库本身高度灵活,造成性能不足,严重依赖开发人员的表设计能力以及索引优化能力,在这里给几点优化建议

  • 时间类型转化为时间戳格式,用int类型储存,建索引增加查询效率

  • 建议字段定义not null,null值很难查询优化且占用额外的索引空间

  • 使用TINYINT类型代替枚举ENUM

  • 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE

  • 字段长度严重根据业务需求来,不要设置过大

  • 尽量不要使用TEXT类型,如必须使用建议将不常用的大字段拆分到其它表

  • MySQL对索引字段长度是有限制的, innodb引擎的每个索引列长度默认限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节(mysql8.0单索引可以创建1024字符)

  • 大表有DDL需求时请联系DBA

       最左索引匹配规则

       顾名思义就是最左优先,在创建组合索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。复合索引很重要的问题是如何安排列的顺序,比如where后面用到c1, c2 这两个字段,那么索引的顺序是(c1,c2)还是(c2,c1)呢,正确的做法是,重复值越少的越放前面,比如一个列 95%的值都不重复,那么一般可以将这个列放最前面

  • 复合索引index(a,b,c)

  • where a=3 只使用了a

  • where a=3 and b=5 使用了a,b

  • where a=3 and b=5 and c=4 使用了a,b,c

  • where b=3 or where c=4 没有使用索引

  • where a=3 and c=4 仅使用了 a

  • where a=3 and b>10 and c=7 使用了a,b

  • where a=3 and b like 'xx%' and c=7 使用了a,b

  • 其实相当于创建了多个索引:key(a)、key(a,b)、key(a,b,c)

二、数据库切换到PloarDB读写分离

       PolarDB是阿里云自研的下一代关系型云数据库,100%兼容MySQL存储容量最高可达100 TB,单库最多可扩展到16个节点,适用于企业多样化的数据库应用场景。PolarDB采用存储和计算分离的架构,所有计算节点共享一份数据,提供分钟级的配置升降级、秒级的故障恢复、全局数据一致性和免费的数据备份容灾服务。

  • 集群架构,计算与存储分离

    PolarDB采用多节点集群的架构,集群中有一个Writer节点(主节点)和多个Reader节点(只读节点),各节点通过分布式文件系统(PolarFileSystem)共享底层的存储(PolarStore)

  • 读写分离

    当应用程序使用集群地址时,PolarDB通过内部的代理层(Proxy)对外提供服务,应用程序的请求都先经过代理,然后才访问到数据库节点。代理层不仅可以做安全认证和保护,还可以解析SQL,把写操作(例如事务、UPDATE、INSERT、DELETE、DDL等)发送到主节点,把读操作(例如SELECT)均衡地分发到多个只读节点,实现自动的读写分离。对于应用程序来说,就像使用一个单点的数据库一样简单。

       在离线混合场景:不同业务用不同的连接地址,使用不同的数据节点,避免相互影响

2.png

       Sysbench性能压测报告:

  • PloarDB 4核16G 2台

3.png

4.png

  • PloarDB 8核32G 2台

5.png

6.png

三、分表历史数据迁移到MySQL8.0 X-Engine存储引擎

       分表业务表保留3个月数据(这个根据公司需求来),历史数据按月分表到历史库X-Engine存储引擎表, 为什么要选用X-Engine存储引擎表,它有什么优点?

  1. 节约成本, X-Engine的存储成本约为InnoDB的一半

  2. X-Engine分层存储提高QPS, 采用层次化的存储结构,将热数据与冷数据分别存放在不同的层次中,并默认对冷数据所在层次进行压缩

       X-Engine是阿里云数据库产品事业部自研的联机事务处理OLTP(On-Line Transaction Processing)数据库存储引擎。

       X-Engine存储引擎不仅可以无缝对接兼容MySQL(得益于MySQL Pluginable Storage Engine特性),同时X-Engine使用分层存储架构。因为目标是面向大规模的海量数据存储,提供高并发事务处理能力和降低存储成本,在大部分大数据量场景下,数据被访问的机会是不均等的,访问频繁的热数据实际上占比很少,X-Engine根据数据访问频度的不同将数据划分为多个层次,针对每个层次数据的访问特点,设计对应的存储结构,写入合适的存储设备

  • X-Engine使用了LSM-Tree作为分层存储的架构基础,并进行了重新设计:

  • 热数据层和数据更新使用内存存储,通过内存数据库技术(Lock-Free index structure/append only)提高事务处理的性能。

  • 流水线事务处理机制,把事务处理的几个阶段并行起来,极大提升了吞吐。

  • 访问频度低的数据逐渐淘汰或是合并到持久化的存储层次中,并结合多层次的存储设备(NVM/SSD/HDD)进行存储。

  • 对性能影响比较大的Compaction过程做了大量优化:

  • 拆分数据存储粒度,利用数据更新热点较为集中的特征,尽可能的在合并过程中复用数据。

  • 精细化控制LSM的形状,减少I/O和计算代价,有效缓解了合并过程中的空间增大。

  • 同时使用更细粒度的访问控制和缓存机制,优化读的性能。

7.png

四、阿里云PloarDB MySQL8.0版本并行查询

       分表之后我们的数据量依然很大,并没有完全解决我们的慢查询问题,只是降低了我们业务表的体量,这部分慢查询我们需要用到PolarDB的并行查询优化

       PolarDB MySQL 8.0重磅推出并行查询框架,当您的查询数据量到达一定阈值,就会自动启动并行查询框架,从而使查询耗时指数级下降

       在存储层将数据分片到不同的线程上,多个线程并行计算,将结果流水线汇总到总线程,最后总线程做些简单归并返回给用户,提高查询效率。

       并行查询(Parallel Query)利用多核CPU的并行处理能力,以8核32 GB配置为例,示意图如下所示。

8.png

       并行查询适用于大部分SELECT语句,例如大表查询、多表连接查询、计算量较大的查询。对于非常短的查询,效果不太显著。

       并行查询用法,使用Hint语法可以对单个语句进行控制,例如系统默认关闭并行查询情况下,但需要对某个高频的慢SQL查询进行加速,此时就可以使用Hint对特定SQL进行加速。

       SELECT /+PARALLEL(x)/ ... FROM ...; -- x >0

       SELECT /*+ SET_VAR(max_parallel_degree=n) */ * FROM ... // n > 0

       查询测试:数据库配置 16核32G 单表数据量超3千万

       没加并行查询之前是4326ms,加了之后是525ms,性能提升8.24倍

9.png

10.png

五、交互式分析Hologre

       大表慢查询我们虽然用并行查询优化提升了效率,但是一些特定的需求实时报表、实时大屏我们还是无法实现,只能依赖大数据去处理。

       这里推荐大家阿里云的交互式分析Hologre(https://help.aliyun.com/product/113622.html)

11.png

六、后记

       千万级大表优化是根据业务场景,以成本为代价优化的,不是一上来就数据库水平切分扩展,这样会给运维和业务带来巨大挑战,很多时候效果不一定好,我们的数据库设计、索引优化、分表策略是否做到位了,应该根据业务需求选择合适的技术去实现。


作者:福禄网络研发团队

原文链接:https://www.cnblogs.com/fulu/p/13913173.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 当前的风气是,谈测试,必言“接口”。其实接口并不神秘,当今的应用中无处不是“接口”,从本篇开始让我来谈一些关于接口的浅薄认识。一个简单的接口(demo.php)<?php     // 文件名称demo.php     // 告诉浏览器返回为json类型     header('Content-Type:application/json; charset=utf-8');     //...
            1 0 1793
            分享
          •   近日,有消息称,腾讯XR(扩展现实)团队全线解散,字节跳动收购的VR企业PICO启动人员调整优化。  XR是虚拟现实(VR)、增强现实(AR)和混合现实(MR)等沉浸式技术的总称。2022年6月,腾讯宣布成立软硬一体的XR业务线,归入腾讯互动娱乐事业群(IEG),被外界视为高调进军元宇宙的信号。腾讯高级副总裁马晓轶当时表示,该布局是希望抓住未来4-5年内的机会,在软件、内容、系统、工具SDK、硬件等各环节积极尝试,打造行业标杆的VR产品与体验。  对于解散传闻,今日腾讯方面回复记者称,腾讯游戏 XR 业务将变更硬件发展路径,相关业务团队进行调整。腾讯将为受影响员工提供两个月过渡期,并优先安...
            0 0 849
            分享
          • 读者提问:文件下载,用例怎么写 ?阿常回答:我们先给文件下载一个特定的场景:不支持批量下载,只能一个一个的下载。一、文件下载测试点一)基本功能1、支持当前页面下载,还是新窗口打开另存为。2、下载后比对文件,是否和上传时的文件完全一致。3、注意文件名称为空、含特殊字符及文件名称较长的文件,下载后的文件是否和上传时的一致。4、下载文件过程中断网,等网络恢复,看文件是否继续下载。二)文件存储1、文件上传到服务器之后,采用的是文件存储 NAS 还是对象存储 OSS。2、文件上传到服务器之后,是否有做容灾备份。三)安全问题1、文件上传到服务器之后,文件名是否做了加密。四)权限测试1、不具备访问...
            0 0 1317
            分享
          •   今日,基于 HarmonyOS NEXT 的 WPS 鸿蒙版正式开启公测,官方称,一年时间跨平台移植 4000 万行代码,实现全端流畅运行。  据介绍,基于 HarmonyOS NEXT 的原生互联、原生流畅等特性,WPS 鸿蒙版不仅能在 PC 端更流畅运行,还能实现与手机、平板、智慧屏等多种设备之间的无缝流转和跨端协同。  据金山办公介绍,在开发 WPS 鸿蒙原生应用过程中,团队共计完成了超过 4000 万行代码的跨平台移植工作,实现了跨平台交互界面的兼容,并推动第三方跨平台基础设施建设。经过一年多的不懈努力,在与鸿蒙工程师的密切配合下,WPS 研发团队在诸如手机端、折叠屏、平板等不同大...
            0 0 323
            分享
          •   今天给大家推荐一款基于Python的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了WEB浏览器自动化的便利性和 requests 的高效率。  一、DrissionPage产生背景  实现网页自动化,会有两类形式: - 直接向服务器发送请求数据包,获取需要的数据 - 模拟真实用户操作行为,控制浏览器跟网页进行交互  前者轻量级,速度快,例如requests 库。但requests面对需要登录的网站时,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,开发效率...
            0 0 3158
            分享
      • 51testing软件测试圈微信