经常混迹于技术社区,频繁看到这个题目,今天干脆在自己博客重复一遍解决办法:

针对mysql,sqlserver等关系型数据库单表数据过大的处理方式

如果不是阿里云分布式数据库 DRDS 那种多机器集群方案的话: 先考虑表分区 ;然后考虑分表 ;然后考虑分库。

这个题目是我所经历过的,我做的是GPS应用,早期版本就是选用的关系型数据库Sql Server。当时我选取的方案就是第一种:表分区。 表分区的优势是,如果表结构合理,可以不涉及到程序修改。也就是说,对程序来讲依然是单表读写的效果!

所有轨迹数据存入到一个巨大的表里。有多大呢?

  • 最大存储量超过10亿行。具体数值应该是12亿多点,由于系统设计为只存储30天轨迹,所以线上期间最大存储只到这个数,再后来采用云架构,上云替换成非关系性数据库,获得了更高的写入性能和存储压缩能力。

  • 每日写入量就超过1500万行。上下班交通高峰时候每秒写入量平均超过500行。也就是500iops,距离系统设计的压测指标3000还有一大截

这张大型单表设计要点:(一个聚集索引用于写入,一个联合索引用于查询,没有主键,使用表分区)

明确主键用途:

真的需要查询单行数据时候才需要主键!

我采用无主键设计,用于避免写入时候浪费维护插入数据的性能。最早使用聚集的类似自增的id主键,压测写入超过5亿行的时候,写入性能缩减一半

准确适用聚集:

写入的数据在硬盘物理顺序上是追加,而不是插入!

我把时间戳字段设置为聚集索引,用于聚集写入目的设计。保证硬盘上的物理写入顺序,不浪费性能用于插入数据

职责足够单一:

用于精准索引!

使用时间+设备联合索引,保证这张表只有一个查询用途。保证系统只有一种查询目的:按照设备号,查询一个时间段的数据。

精确的表分区:

要求查询时候限定最大量或者最大取值范围!

按天进行表分区,实现大数据量下的高效查询。这里是本文重点,按照聚集索引进行,可以让目标数据局限在更小的范围进行,虽然单表数据上亿,但是查询基本上只在某一天的的几千万里进行索引查询

每张表会有各自的特点,不可生搬硬套,总结下我这张表的特点:

只增,不删,不改!

关于不删除中:每天使用作业删除超过30天的那个分区数据除外,因为要清空旧的表分区,腾出新的表分区!

只有一个业务查询:只按照设备编码查询某个时间段

只有一个运维删除:删除旧的分区数据

这张表,是我技术生涯中进步的一个大阶梯,让我我体会到了系统架构的意义。

虽然我的这张举行表看似只有4个关键点,但是这四个非常精准的关键点设计,耗费了我一个月之久!正是这么足够精准的表结构设计,才撑起了后来压测并发量超过3000的并发写入量!压测的指标跟数据库所在的硬盘有直接关系,当时选取的硬盘是4块10000转的SAS盘做了Raid10的环境

关于后来为什么没有更高的实际应用数值,是因为系统后来改版为云架构,使用了阿里云,更改为写入性能更高的非关系型数据库MongoDB存储轨迹数据。所以虽然距离压测指标还差很远,但是也没有实际跑到这个数据!单机应用再怎么改造,每次升级都是一件麻烦事,所以应当尽可能将瓶颈点提高,甚至消除,云架构的意义就在于弹性扩展,虽然我在数据库方面还没有这方面的成功案例可分享,但是这种架构的意义很明白:将来面对更大的压力,只需要增加服务器数量!

最后提一句, 很多人觉得SSD就足够高的性能了,但是对于云服务器,ssd的性能才跟传统物理机的iops相持平,这是由于虚拟化层面的损失导致的!

原文地址: https://www.opengps.cn/Blog/View.aspx?id=284 文章的更新编辑依此链接为准。欢迎关注源站原创文章!

mysql,sqlserver数据库单表数据过大的处理方式相关推荐

  1. 面试官问单表数据量大一定要分库分表吗?我们用六个字和十张图回答

    1 文章概述 在业务发展初期单表完全可以满足业务需求,在阿里巴巴开发手册也建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时 ...

  2. MySQL将表中的yes改成no_mysql在不需要改程序的情况下通过操作数据库对单表数据量大的表进行分表...

    1.为什么要分表? 数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询速度变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. mysql中有一种机制是表锁定和行锁定, ...

  3. 软件架构场景之—— 分表分库:单表数据量大读写缓慢如何解决?

    业务背景 一个电商系统的架构优化,该系统中包含用户和订单 2 个主要实体,每个实体涵盖数据量如下表所示 实体 数据量 增长趋势 用户 上千万 每日十万 订单 上亿 每日百万级速度增长,之后可能是千万级 ...

  4. 数据库单表数据过亿_我也能写数据库 —— 单表查询

    前言 说不定期更新,就不定期更新:). 在翻译关系代数这篇文档的时候,总有一种惴惴不安的感觉伴随着我,其实还是对之前概览的一知半解,而DEMO项目Calcite-example-CSV为了介绍特性,添 ...

  5. 数据库单表数据过亿_最受欢迎的三大数据库,你用过吗?

    随着市场的多元化,需求场景多样化,数据库也层出不穷,来适应不同的业务场景,今天小编就给大家总结一下目前下面来总结下目前最受欢迎的三大数据库,快来看看你有没有用过吧. 1.MySQL MySQL是一种关 ...

  6. mysql查询数据库每张表数据量大小和占用多少空间

    selecttable_schema as '数据库',table_name as '表名',table_rows as '记录数',truncate(data_length/1024/1024, 2 ...

  7. 数据库、表数据的三种删除方式

    第一种:drop table; 第二种:delete table; t第三种:runcate table; 三种方式的区别: Drop table删表(常用于正对表),表结构都会被删除.而delete ...

  8. oracle单表数据量上亿_MySQL数据库中,数据量越来越大,有什么具体的优化方案么?...

    个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发.运维的复杂度会直线上升,而大多数公司和开发人员是欠缺这种能力的. 所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化 ...

  9. MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?

    今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢? 曾经在中国互联网技术圈广为流传着这么一个 ...

  10. 为什么大家说mysql数据库单表最大两千万?依据是啥?

    故事从好多年前说起. 想必大家也听说过数据库单表建议最大2kw条数据这个说法.如果超过了,性能就会下降得比较厉害. 巧了. 我也听说过. 但我不接受它的建议,硬是单表装了1亿条数据. 这时候,我们组里 ...

最新文章

  1. docker-compose常用命令整理及使用示例
  2. mongodb连接失败_深入浅出mongodb(一)
  3. 分享WEBAPP利用纯HTML5实现拨打电话,打开相册,打开摄像头源码
  4. C/C++报错:全局变量重定义或是多次定义
  5. React开发(274):ant design 时间显示秒
  6. MSSQL 2005数据库与SP4补丁安装
  7. LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)
  8. nodejs 获取cpu核心数量_用 NodeJS 充分利用多核 CPU 的资源[每日前端夜话0xCB]
  9. c/c++视频教程哪个比较好? 能学下去的?
  10. 信息安全工程师笔记-大数据安全威胁与需求分析
  11. 关于Dll、Com组件、托管dll和非托管dll的理解
  12. 余额宝收益冻结是什么意思?
  13. cpu上干硅脂怎么清理_cpu导热硅脂如何涂抹,涂抹的时候需要注意哪些事项
  14. linux文件描述符、软硬连接、输入输出重定向
  15. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
  16. 安装好jdk后在cmd窗口输入Java 出现Error: could not open `D:\java2\lib\amd64\jvm.cfg'
  17. 从零开发微信公众号(PC)
  18. 2021 USGS Landsat 8 批量下载教程
  19. Java字节码魔法数字_Java的魔法:字节码
  20. Linux软件包管理工具-yum

热门文章

  1. 微信小程序封装post,get
  2. 微信小程序微商城:开发者key获取
  3. React 入门第一天(小案例和注意细节)
  4. ABP vnext框架 返回JSON时间带T格式转换解决方案
  5. 六石管理学:到了一定境界,确实可以随心所欲
  6. LINUX下载并编译sqlite
  7. 编程基本功:如果可能,不用if,尽量使用switch
  8. 博客积分为0,这是又出错了?
  9. LINUX下载编译libsrtp-1.5.0
  10. LINUX X11剪贴板/clipboard访问C代码范例