当前位置: 首页 > news >正文

数据库分库分表扫盲,不会用也得知道概念

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)什么是分库分表

分库分表故名思意是将一张表拆分成多个表,可能是一个库中的分表,也可能是分库又分表。分库分表主要解决的问题是数据库的性能瓶颈问题。即使建立索引,当数据量超过一定值时,查询效率就注定会降下来。通过分库分表,可以将原本的大数据拆分到多个表或者库中。

但是分库分表并非是很优的方式,在不需要分库分表的情况下,尽量不要盲目去拆分数据库,也不要过度拆分数据库。

(二)分库分表方式

2.1 横向拆分

这种拆分方式往往用于数据量庞大的表,是对数据的切割, 比如一个表中有4000万条数据,即使建立了索引,也会导致IO次数增加,查询效率低的问题。这个时候,我们就可以把这张4000万数据的表拆分成4张1000万条数据的表。

2.2 纵向拆分

纵向拆分往往是基于业务的拆分,纵向分表是将一个表按照字段拆分成多张表,每个表存储其中的一部分字段。

比如我们做一个电商系统,原来在商品表里存放了商品的基本信息和详细描述,但是在实际使用时,商品详细描述只有在用户点进商品里面时才需要,因此我们可以将他单独拆分出来。

(三)分库分表的问题

在没有必要拆分的情况下,不建议做分库分表的操作,因为分库分表会带来一些问题,比如:

1、横向拆分的主键问题:

横向拆分时将数据分到了多个库或者多个表中,那么查询或者新增时,必须要确保能准确定位到该数据主键所在的位置。

2、纵向拆分的join问题:

纵向拆分时,我们按字段把表分成了多个,但是当需要用到数据时,不可避免就需要多表join进行查询。

3、分页查询问题:

当我们把数据拆分到多张表,然后又需要按照某种条件排序分页查询时,这个操作就会很麻烦。比如,我要按时间排序分页查询所有数据,你就要把每个表的数据都拿出来,在内存中做一层排序,再返回给接口调用方。

4、去重函数

单表时,通过distinct就可以把重复的数据去掉,但是如果数据保存在多张表,这些函数就很难操作了。同样的道理还可以用在group分组、sum函数等等。

除此之外,分库分表还可能导致很多其他问题。

(四)分库分表的组件

既然分库分表有那么多问题,但是我们又不得不去分库,有什么其他办法呢?一些组件可以帮我们让分库分表变得更加方便和高效。

现在主流的有京东数科的shardingsphereMycatTddl等等。shardingsphere目前已经是Apache的顶级项目,目前看来是最值得使用的组件。

(五)总结

本文对分库分表的一些基本概念和问题进行了讲解,不管是分库还是分表,在真实的场景下一定要做好技术储备以及合理的拆分方案。接下来我会发表几篇关于分库分表组件shardingsphere的使用,我是Java鱼仔,我们下期再见!

相关文章:

  • 写了那么久的String字符串,你可能根本不懂它!
  • 2012 借教室
  • 怎样才能写出规范的好代码?
  • 让Android Studio支持系统签名
  • 详解Java中的BIO、NIO、AIO
  • 取经阿里十年技术大佬,得到Java线上问题排查攻略!
  • Understanding memory usage on Linux
  • Java中的拦截器和过滤器有什么区别
  • 为什么要引入分布式任务调度系统?
  • 为什么说datax是目前最好的异构数据源数据交换工具
  • Java常用关键字:this、super、final、static、访问修饰符
  • JAVA UUID 生成唯一标识
  • 网络开发的最强大框架:Netty快速入门
  • 适配器模式详解与应用
  • 树莓派 - 使用须知
  • 【Amaple教程】5. 插件
  • 4个实用的微服务测试策略
  • C++11: atomic 头文件
  • go append函数以及写入
  • in typeof instanceof ===这些运算符有什么作用
  • java2019面试题北京
  • java8 Stream Pipelines 浅析
  • js作用域和this的理解
  • laravel5.5 视图共享数据
  • learning koa2.x
  • Lsb图片隐写
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Shell编程
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 码农张的Bug人生 - 初来乍到
  • 配置 PM2 实现代码自动发布
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 深入浅出webpack学习(1)--核心概念
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 跳前端坑前,先看看这个!!
  • 【云吞铺子】性能抖动剖析(二)
  • elasticsearch-head插件安装
  • k8s使用glusterfs实现动态持久化存储
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #{} 和 ${}区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件设置了忽略但不生效
  • .NET Remoting学习笔记(三)信道
  • .NET 设计一套高性能的弱事件机制