大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?分库分表了是怎么做的?分表分库了有什么问题?有用到中间件么?他们的原理知道么?

文章目录

  • 大表怎么优化
  • 分库分表
    • 垂直分区
    • 垂直分表
    • 水平分区
    • 水平分表
  • 分库分表后面临的问题
  • 本文小结

大表怎么优化

当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:

  1. 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
  2. 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
  3. 缓存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;

还有就是通过分库分表的方式进行优化,主要有垂直分表水平分表


分库分表

垂直分区

根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。

简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示,这样来说大家应该就更容易理解了。


垂直拆分的优点: 可以使得行数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。

垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;

垂直分表

把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中


适用场景

  1. 如果一个表中某些列常用,另外一些列不常用
  2. 可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数

缺点

  1. 有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差
  2. 对于应用层来说,逻辑算法增加开发成本
  3. 管理冗余列,查询所有数据需要join操作

水平分区

保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量

水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。


水品拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平拆分最好分库

水平拆分能够支持非常大的数据量存储,应用端改造也少,但分片事务难以解决 ,跨界点Join性能较差,逻辑复杂

《Java工程师修炼之道》的作者推荐尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。

水平分表

表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询次数


适用场景

  1. 表中的数据本身就有独立性,例如表中分表记录各个地区的数据或者不同时期的数据,特别是有些数据常用,有些不常用。
  2. 需要把数据存放在多个介质上。

水平切分的缺点

  1. 给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作
  2. 在许多数据库应用中,这种复杂度会超过它带来的优点,查询时会增加读一个索引层的磁盘次数

下面补充一下数据库分片的两种常见方案

客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。

中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现在谈的 Mycat 、360的Atlas、网易的DDB等等都是这种架构的实现。


分库分表后面临的问题

事务支持 分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

跨库join,只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。 分库分表方案产品

跨节点的count,order by,group by以及聚合函数问题 这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

数据迁移,容量规划,扩容等问题 来自淘宝综合业务平台团队,它利用对2的倍数取余具有向前兼容的特性(如对4取余得1的数对2取余也是1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度。

ID问题,一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由.,一些常见的主键生成策略

UUID使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,除占用大量存储空间外,最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题。 Twitter的分布式自增ID算法Snowflake 在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位 机器ID 10位 毫秒内序列12位。

跨分片的排序分页,般来讲,分页时需要按照指定字段进行排序。当排序字段就是分片字段的时候,我们通过分片规则可以比较容易定位到指定的分片,而当排序字段非分片字段的时候,情况就会变得比较复杂了。为了最终结果的准确性,我们需要在不同的分片节点中将数据进行排序并返回,并将不同分片返回的结果集进行汇总和再次排序,最后再返回给用户。如下图所示:


本文小结

分库分表以后需要处理的问题比单机版的数据库,在技术实现和业务逻辑处理上,呈现几何级难度上升,不是万不得已的情况,尽量不要分库分表。

mysql中的分库分表相关推荐

  1. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有 种树人 ./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  2. Linux+MySQL+MyCat实现分库分表,通过MyCat数据库中间件实现分库分表配置实战

    目录 前言 Linux+MySQL+MyCat实现读写分离,主从同步的解决方案 一.Linux下MySQL数据库服务的安装与部署 二.下载Linux MyCat 三.上传Linux服务器,并解压 四. ...

  3. MySQL数据库的分库分表方案

    MySQL数据库的分库分表方案 一. 数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数 ...

  4. mysql主从shardingsphere分库分表

    问题: 1. 公司的mysql主从复制方式怎么查看--这个命令在哪敲 2.公司扩容一个从的时候怎么做的?-- 3.公司主从架构模式是什么样的?几主几从 4.公司的业务场景有木有要求写后立马查出数据的 ...

  5. 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表

    如何最大限度的使用数据库性能,全网最细节讲解缓存方案 视频讲解如下,点击观看: 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表|c/c ...

  6. mysql 按时间分库分表_sharding-jdbc 按时间分库分表

    一. 分库分表规则 会计系统按会计时间分库分表(一月一张表,一年一个库): 以center_entry_flow表为例: arch_center_acct(database) center_entry ...

  7. mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...

    今天介绍下sharding-sphere,主要介绍他的特性,分库分表的技术的详解. (一)下载源码官网地址获取源码https://shardingsphere.apache.org/index_zh. ...

  8. MySql使用MyCat分库分表(四)分片规则

    视频学习地址:17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址:MySQL 分库分表 | xustudyxu's Blog (frxcat.fun) 分片规则 范围分片 介绍 根据指定 ...

  9. MySql使用MyCat分库分表(一)

    前几天面试,被面试官问道,工作中是否用到过分库分表.(⊙﹏⊙),当然没用到过,所以赶紧补一下! 视频学习地址:17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址:MySQL 分库分表 | ...

最新文章

  1. excel工具栏隐藏了怎么办_真正的EXCEL隐藏技巧来啦!这5个你都会吗?
  2. python输出指定字符串_Python输出指定字符串的方法
  3. 键盘输入Scanner类方法属性使用
  4. “约见”面试官系列之常见面试题之第六十篇之事件绑定和普通事件(建议收藏)
  5. LibLinear(SVM包)使用说明之(二)MATLAB接口
  6. Opencv+Python:drawContours函数
  7. 模型修饰在无人机航测实景三维模型生产中的应用——以SVSMeshEditor软件为例
  8. GroovyHelp方便查看java api
  9. java中设置http响应头控制浏览器禁止缓存当前文档内容
  10. 【图像融合】基于matalb四叉树的加权聚焦多聚焦图像融合【含Matlab源码 1818期】
  11. php 递归函数 示例,php递归使用示例(php递归函数)
  12. 3D NAND“大连造”
  13. 面对Google流量红利期,独立站卖家如何借势营销?
  14. 2022 Gartner新兴技术成熟曲线
  15. iOS开启个人热点的纵向适配
  16. 网络故障诊断的原则[转自www.cnitblog.com/wildon]
  17. jQuery事件总结
  18. T字形路口小车如何要c语言编程,一点通驾校模拟考试
  19. 大数据面试之Hive常见题目
  20. 天津教育杂志天津教育杂志社天津教育编辑部2022年第30期目录

热门文章

  1. MySQL里的日期技巧
  2. c#遍历一个文件夹下的所有文件包括子文件夹【原】
  3. ASP.NET AJAX入门系列
  4. 怎样才能有德国煤矿那样严密的安全网?
  5. 关于H5跳转到小程序和android的方法
  6. P1855 榨取kkksc03
  7. R+Hadoop大数据方案有哪些坑?
  8. 10_Shell语言———I/O重定向详解
  9. vue 头部组件监控页面来源
  10. var _ 接口 = 结构体{}